[转]C#通过Expression实现 字符串转表达式 自定义计算体积参数

表达式转换(PTA) 算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。 输入格式: 输入在一行中给出不含空格的中缀表达式,可包含+、-、*、\以及左右括号(),表达式不超过20个字符。 输出格式: 在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。 输入样例: 2+3*(7-4)+8/4 输出样例: 2 3 7 4 - * + 8 4 / + 我的代码是格式错误, 阅读详情

(转载请删除括号里的内容)

Expression实现 字符串转表达式 自定义计算体积参数


这篇文章是为了解决我工作中的一个需求而写,希望能帮到有需要的人

需求的这样的:
业务想让用户输入任意表达式进行计算假如成立则允许操作

表达式组成:
常量与特殊变量进行任意加减乘除有特殊值比较大小

表达式实例:

  1. L+2*W<200
  2. H>50
  3. L/W+H*20-10>=100

调用方法

ExpressionVolume expressionVolume = new ExpressionVolume();

            //计算表达式的值
            Console.WriteLine(expressionVolume.InvokeOperator("L+10+2*W/10+H+200-800/20+L+W>=200", new ExpressionVolume.VolumeClass(10, 50, 100)));
            Console.WriteLine(expressionVolume.InvokeOperator("L+10+2*W/10+H+200-800/4+L+H/W>=200", new ExpressionVolume.VolumeClass(1, 1, 1)));

            Console.WriteLine((decimal)10 + (decimal)10 + (decimal)2 * (decimal)50 / (decimal)10 + (decimal)100 + (decimal)200 - (decimal)800 / (decimal)20 + (decimal)10 + (decimal)50);
            Console.WriteLine((decimal)1 + (decimal)10 + (decimal)2 * (decimal)1 / (decimal)10 + (decimal)1 + (decimal)200 - (decimal)800 / (decimal)4 + (decimal)1 + (decimal)1 / (decimal)1);

            //比较表达式是否成立
            Console.WriteLine(expressionVolume.InvokeEqual("L+10+2*W/10+H+200-800/20+L+W<200", new ExpressionVolume.VolumeClass(10, 50, 100)));
            Console.WriteLine(expressionVolume.InvokeEqual("L+10+2*W/10+H+200-800/4+L+H/W<200", new ExpressionVolume.VolumeClass(1, 1, 1)));

            //验证表达式是否成立(!=-1表示成立)
            Console.WriteLine(expressionVolume.Verification("L+10+2*W/10+H+200-800/20+L+W<200")); 
            Console.WriteLine(expressionVolume.Verification("W+10+2*W/10+H+200-800/20+W+W<200"));
            Console.WriteLine(expressionVolume.Verification("L+2+2*-W/10+H+200-800/20+L+W<=200"));
            Console.WriteLine(expressionVolume.Verification("-L+33+2/*W/10+H+200-800/20+L+W>=200"));
            Console.WriteLine(expressionVolume.Verification("L+10-+2*W/10+H+200-800/20+L+W"));
            Console.WriteLine(expressionVolume.Verification("L++10+2*W/10+H+200-800/20+L+W"));
            expressionVolume.Verification("L+10+2*W/10+HL+200-800/20+L+W<200");

代码实现

/// <summary>
    /// 计算体积参数
    /// </summary>
    public class ExpressionVolume
    {
        #region 私有类
        /// <summary>
        /// 体积参数类
        /// </summary>
        public class VolumeClass
        {
            /// <summary>
            /// 不可以去掉
            /// Expression合成方法时需要支持无参实例化
            /// </summary>
            public VolumeClass()
            {

            }

            /// <summary>
            /// 实例化
            /// </summary>
            /// <param name="Long">长</param>
            /// <param name="Width">宽</param>
            /// <param name="Height">高</param>
            public VolumeClass(decimal? Long, decimal? Width, decimal? Height, decimal? Wt_Weight = null)
            {
                this.L = Long ?? 0;
                this.W = Width ?? 0;
                this.H = Height ?? 0;
                this.Wt_Weight = Wt_Weight ?? 0;
            }

            /// <summary>
            /// 长
            /// </summary>
            /// <remarks>
            /// 不能随意改变字段名
            /// Expression合成方法时需要
            /// </remarks>
            public decimal L { get; set; }

            /// <summary>
            /// 宽
            /// </summary>
            /// <remarks>
            /// 不能随意改变字段名
            /// Expression合成方法时需要
            /// </remarks>
            public decimal W { get; set; }

            /// <summary>
            /// 高
            /// </summary>
            /// <remarks>
            /// 不能随意改变字段名
            /// Expression合成方法时需要
            /// </remarks>
            public decimal H { get; set; }

            /// <summary>
            /// 重量
            /// </summary>
            public decimal Wt_Weight { get; set; }
        }
        #endregion

        /// <summary>
        /// 线程锁,防止缓存键值对时异常
        /// </summary>
        private readonly static object Lock = new object { };

        /// <summary>
        /// 缓存表达式(比较)
        /// </summary>
        private readonly static Dictionary<string, Func<VolumeClass, bool>> DicEqual = new Dictionary<string, Func<VolumeClass, bool>>();

        /// <summary>
        /// 比较表达式是否成立
        /// </summary>
        /// <param name="expressionString">表达式</param>
        /// <param name="volume">体积参数</param>
        /// <returns></returns>
        public bool InvokeEqual(string expressionString, VolumeClass volume)
        {
            if (DicEqual.ContainsKey(expressionString))
            {
                return DicEqual[expressionString].Invoke(volume);
            }

            var strs = expressionString.Split('>', '<');

            if (strs.Length != 2)
            {
                DicEqual.Add(expressionString, t => false);
                return false;
            }

            //定义体积参数
            ParameterExpression parameterExpression = Expression.Parameter(typeof(VolumeClass), "volume");
            Expression expression = GetExpression(strs[0], parameterExpression);

            //是否大于
            bool IsGreaterThan = expressionString.Contains('>');

            //是否允许相等
            bool IsEqual = strs[1].StartsWith("=");
            strs[1] = strs[1].TrimStart('=');

            decimal Equal = decimal.Parse(strs[1]);

            if (IsGreaterThan)
            {
                if (IsEqual)
                {
                    expression = Expression.GreaterThanOrEqual(expression, Expression.Constant(Equal, typeof(decimal)));
                }
                else
                {
                    expression = Expression.GreaterThan(expression, Expression.Constant(Equal, typeof(decimal)));
                }
            }
            else
            {
                if (IsEqual)
                {
                    expression = Expression.LessThanOrEqual(expression, Expression.Constant(Equal, typeof(decimal)));
                }
                else
                {
                    expression = Expression.LessThan(expression, Expression.Constant(Equal, typeof(decimal)));
                }
            }
            //获得Lambda表达式
            Expression<Func<VolumeClass, bool>> Lambda = Expression.Lambda<Func<VolumeClass, bool>>(expression, parameterExpression);

            //生成对应的委托
            var func = Lambda.Compile();

            //防止并发导致异常
            if (!DicEqual.ContainsKey(expressionString))
            {
                lock (Lock)
                {
                    if (!DicEqual.ContainsKey(expressionString))
                    {
                        //缓存委托
                        DicEqual.Add(expressionString, func);
                    }
                }
            }

            return func.Invoke(volume);
        }

        /// <summary>
        /// 缓存表达式(计算值)
        /// </summary>
        private readonly static Dictionary<string, Func<VolumeClass, decimal>> DicOperator = new Dictionary<string, Func<VolumeClass, decimal>>();

        /// <summary>
        /// 得到表达式左侧的值
        /// </summary>
        /// <param name="expressionString">表达式</param>
        /// <param name="volume">体积参数</param>
        /// <returns></returns>
        public decimal InvokeOperator(string expressionString, VolumeClass volume)
        {
            if (DicOperator.ContainsKey(expressionString))
            {
                return DicOperator[expressionString].Invoke(volume);
            }

            var strs = expressionString.Split('>', '<');

            if (strs.Length != 2)
            {
                DicOperator.Add(expressionString, t => -1);
                return -1;
            }

            //定义体积参数
            ParameterExpression parameterExpression = Expression.Parameter(typeof(VolumeClass), "volume");
            System.Linq.Expressions.Expression expression = GetExpression(strs[0], parameterExpression);

            //获得Lambda表达式
            Expression<Func<VolumeClass, decimal>> Lambda = Expression.Lambda<Func<VolumeClass, decimal>>(expression, parameterExpression);

            //生成对应的委托
            var func = Lambda.Compile();

            //防止并发导致异常
            if (!DicOperator.ContainsKey(expressionString))
            {
                lock (Lock)
                {
                    if (!DicOperator.ContainsKey(expressionString))
                    {
                        //缓存委托
                        DicOperator.Add(expressionString, func);
                    }
                }
            }
            return func.Invoke(volume);
        }

        /// <summary>
        /// 验证表达式
        /// </summary>
        /// <param name="expressionString">表达式</param>
        /// <returns></returns>
        public decimal Verification(string expressionString)
        {
            var strs = expressionString.Split('>', '<');

            if (strs.Length != 2)
            {
                DicOperator.Add(expressionString, t => -1);
                return -1;
            }
            if (string.IsNullOrEmpty(strs[1]))
            {
                return -1;
            }

            //定义体积参数
            ParameterExpression parameterExpression = Expression.Parameter(typeof(VolumeClass), "volume");
            System.Linq.Expressions.Expression expression = GetExpression(strs[0], parameterExpression);

            //获得Lambda表达式
            Expression<Func<VolumeClass, decimal>> Lambda = Expression.Lambda<Func<VolumeClass, decimal>>(expression, parameterExpression);

            //生成对应的委托
            var func = Lambda.Compile();

            return func.Invoke(new VolumeClass(1, 1, 1));
        }

        #region 私有方法
        /// <summary>
        /// 生成公共表达式
        /// </summary>
        /// <param name="str"></param>
        /// <param name="parameterExpression">定义体积参数</param>
        /// <returns></returns>
        private System.Linq.Expressions.Expression GetExpression(string str, ParameterExpression parameterExpression)
        {
            if (str.StartsWith("+") || str.StartsWith("-") || str.StartsWith("*") || str.StartsWith("/"))
            {
                throw new Exception("表达式不能已符号开头");
            }
            Expression expression = null;
            foreach (var Add in str.Split('+'))
            {
                if (Add.Contains('-'))
                {
                    //假如是第一次进入则表示还是+
                    bool IsFirst = true;
                    foreach (var Subtract in Add.Split('-'))
                    {
                        Expression _expression = null;
                        if (Subtract.Contains('*'))
                        {
                            _expression = MultiplyAction(Subtract, parameterExpression);
                        }
                        else if (Subtract.Contains('/'))
                        {
                            _expression = DivideAction(Subtract, parameterExpression);
                        }
                        else
                        {
                            _expression = GetPropertyOrConstant(Subtract, parameterExpression);
                        }
                        if (IsFirst)
                        {
                            expression = expression == null ? _expression : Expression.Add(expression, _expression);
                        }
                        else
                        {
                            //不是第一次进入不可能是null
                            expression = Expression.Subtract(expression, _expression);
                        }
                        IsFirst = false;
                    }
                }
                else if (Add.Contains('*'))
                {
                    Expression _expression = MultiplyAction(Add, parameterExpression);
                    expression = expression == null ? _expression : Expression.Add(expression, _expression);
                }
                else if (Add.Contains('/'))
                {
                    Expression _expression = DivideAction(Add, parameterExpression);
                    expression = expression == null ? _expression : Expression.Add(expression, _expression);
                }
                else
                {
                    //拼接+
                    Expression _expression = GetPropertyOrConstant(Add, parameterExpression);
                    expression = expression == null ? _expression : Expression.Add(expression, _expression);
                }
            }

            return expression;
        }

        /// <summary>
        /// 乘
        /// </summary>
        /// <param name="str"></param>
        private System.Linq.Expressions.Expression MultiplyAction(string str, ParameterExpression parameterExpression)
        {
            List<Expression> list = new List<Expression>();
            foreach (var Multiply in str.Split('*'))
            {
                list.Add(Multiply.Contains('/') ? DivideAction(Multiply, parameterExpression) : GetPropertyOrConstant(Multiply, parameterExpression));
            }
            Expression MultiplyExpression = list[0];
            for (int i = 1; i < list.Count; i++)
            {
                MultiplyExpression = Expression.Multiply(MultiplyExpression, list[i]);
            }
            return MultiplyExpression;
        }

        /// <summary>
        /// 除
        /// </summary>
        /// <param name="str"></param>
        private System.Linq.Expressions.Expression DivideAction(string str, ParameterExpression parameterExpression)
        {
            string[] strs = str.Split('/');
            return Expression.Divide(GetPropertyOrConstant(strs[0], parameterExpression), GetPropertyOrConstant(strs[1], parameterExpression));
        }

        /// <summary>
        /// 获取属性或常量
        /// </summary>
        /// <param name="value">字符串</param>
        /// <param name="parameterExpression">变量参数</param>
        /// <returns></returns>
        private System.Linq.Expressions.Expression GetPropertyOrConstant(string value, ParameterExpression parameterExpression)
        {
            if (string.IsNullOrEmpty(value))
            {
                throw new Exception("符号不能相连");
            }
            Expression expression = null;
            if (value == "L" || value == "W" || value == "H")
            {
                //读取变量的属性
                expression = Expression.Property(parameterExpression, value);
            }
            else
            {
                try
                {
                    expression = Expression.Constant(decimal.Parse(value), typeof(decimal));
                }
                catch (Exception)
                {
                    throw new Exception("长宽高不能相连");
                }
            }
            return expression;
        }
        #endregion
    }

实体类赋值(与本文章无关内容放到这边方便复制)

/// <summary>
   /// 不支持DataRow  泛型缓存
   /// </summary>
   /// <typeparam name="Tout">返回类型</typeparam>
   /// <typeparam name="Tin">接受类型</typeparam>
   public class ModelCopy<Tin, Tout>
   {
       private static Func<Tin, Tout> func { get; set; }//静态缓存字段

       /// <summary>
       /// 赋值
       /// </summary>
       /// <param name="model"></param>
       /// <returns></returns>
       public static Tout Invoke(Tin model)//公共方法,返回Map到的对象实例
       {
           #region 为Func赋值
           if (func == null)
           {
               Type inType = typeof(Tin);
               Type outType = typeof(Tout);

               ParameterExpression parameterExpression = Expression.Parameter(inType, "tIn");//准备一个参数表达式
               List<MemberBinding> memberBindings = new List<MemberBinding>();//准备属性绑定的集合
               foreach (var item in outType.GetProperties())//遍历所有的属性
               {
                   PropertyInfo propertyInfo = inType.GetProperty(item.Name);//获取到传入实例中的属性
                   if (propertyInfo == null)
                       continue;
                   MemberExpression memberExpression = Expression.Property(parameterExpression, propertyInfo);//准备一个成员的表达式
                   MemberBinding memberBinding = Expression.Bind(item, memberExpression);//绑定
                   memberBindings.Add(memberBinding);//添加到列表
               }

               //字段
               //foreach (var item in outType.GetFields())
               //{
               //    FieldInfo fieldInfo = inType.GetField(item.Name);
               //    if (fieldInfo == null)
               //        continue;
               //    MemberExpression memberExpression = Expression.Field(parameterExpression, fieldInfo);
               //    MemberBinding memberBinding = Expression.Bind(item, memberExpression);
               //    memberBindings.Add(memberBinding);
               //}

               MemberInitExpression memberInitExpression = Expression.MemberInit(Expression.New(outType), memberBindings.ToArray());
               Expression<Func<Tin, Tout>> lambdaExpression = Expression.Lambda<Func<Tin, Tout>>(memberInitExpression, new ParameterExpression[] { parameterExpression });
               func = lambdaExpression.Compile();//表达式编译为委托
           }
           #endregion

           return func.Invoke(model);
       }
   }


---------------------
作者:樱桃丶老丸子
来源:优快云
原文:https://blog.youkuaiyun.com/m0_48365841/article/details/121380411
版权声明:本文为作者原创文章,转载请附上博文链接!
 

C#通过Expression实现 字符串转表达式 自定义计算体积参数 Expression实现 字符串转表达式 自定义计算体积参数 调用方法 ExpressionVolume expressionVolume = new ExpressionVolume(); //计算表达式的值 Console.WriteLine(expressionVolume.InvokeOperator("L+10+2*W/10+H+200-800/20+L+W>=200", new ExpressionVolume.VolumeClass(10 阅读详情

相关推荐

Flee轻型表达式引擎:.NET动态计算与AOT友好规则引擎实践

表达式引擎是实现业务逻辑动态化的核心技术,其本质是将字符串形式的计算逻辑安全、高效地解析并求值。原理上分为词法分析、语法解析(如递归下降)和运行时求值(如栈式虚拟机),区别于依赖Expression.Compile或JS引擎的方案,它通过静态类型推导与零反射设计保障确定性性能。技术价值体现在低内存占用、无JIT依赖、AOT原生兼容及强沙箱可控性,特别适用于报表系统、风控策略、BI指标等需热更新且高稳定的生产场景。本文聚焦开源、轻型、表达式引擎Flee在.NET生态中的工程落地。

dejz8829的专栏 366

C#实现将字符串作为表达式运算

曾经有个需求,要把一段字符串表达式作为C#的一段语句来执行。或者直接在sql中存储上不同的含参数的工时如180+20*(n-4)。查出来之后带入参数计算。又好比在win7计算器中粘贴一个表达式,直接输出了结果。碰到这个问题,查了一下网上的资料,发现有以下几种适合我的方案:1.把表达式用字符串的各种函数拆分出来数字和小括号和运算符的组合。然后去运算(即自己写一个类和函数)2.采用T-sql脚本计算。

Nemo的笔记本 3868

C#元数据膨胀如何拖慢.NET程序性能

元数据是.NET运行时实现类型安全、反射、序列化和JIT优化的基础机制,其本质是一组嵌入程序集的结构化描述信息;它在进程加载时即被完整映射进内存,直接推高Working Set并加剧CPU缓存污染;尽管不触发异常或明显耗时逻辑,却通过Page Fault延迟、L1缓存失效率上升和内存带宽争用等隐性路径持续损耗性能;典型WPF或ASP.NET Core应用中,元数据可占程序集体积60%以上,且与是否显式调用反射无关;本文聚焦于医疗影像系统、桌面工具等对启动时间与内存敏感的场景,揭示元数据作为‘隐性税负’的技术

xiang_fu的博客 528

探索表达式的世界:expression-eval开源项目深度解析

探索表达式的世界:expression-eval开源项目深度解析 在编程的浩瀚宇宙中,计算复杂的数学表达式或动态评估逻辑条件常常是不可或缺的一环。对于JavaScript开发者而言,一个强大的表达式解析和求值工具尤为重要。今天,我们来深入挖掘一个曾经广受好评的项目——expression-eval。 项目介绍 expression-eval是一个简洁高效的JavaScript库,专注于解析和计算字...

gitblog_00955的博客 682

.NET 9原生AOT、AI编程与性能优化:C#开发者2026年4月前沿技术解析

在软件开发领域,性能优化与开发效率是永恒的主题。从原理上讲,通过编译优化、垃圾回收机制改进和并发模型设计,可以显著提升应用性能与资源利用率。这些技术的核心价值在于,它们能帮助开发者构建响应更快、资源消耗更少、更易于维护的系统。在实际应用场景中,无论是高并发的Web服务、实时数据处理应用,还是需要快速启动的云原生微服务,都离不开这些底层技术的支撑。本文聚焦于C#与.NET生态,深入探讨了原生AOT编译、SIMD指令集支持、异步编程模型等关键技术,并结合AI智能编程助手、ML.NET轻量级部署等热点,为开发者提

weixin_30307921的博客 332

C#特性滥用风险与工程化精简实践

编程语言的抽象能力是双刃剑——它提升开发效率,也隐匿运行时复杂性。当C#引入dynamic、LINQ、Source Generator等高级特性时,其背后涉及的表达式树编译、状态机生成、编译期代码膨胀等机制,正悄然抬高调试成本与认知门槛。这类抽象泄漏现象,在金融、IoT、医疗等强稳定性场景中尤为致命:编译耗时飙升、GC暂停不可控、新人上手周期延长。本文基于真实项目数据,剖析C# 9~12关键特性的工程熵增表现,并提出以编译期守门(Roslyn Analyzer)、运行时监控(DiagnosticSource

didi9310的博客 391

Flee表达式引擎:基于IL编译的高性能动态计算方案

表达式引擎是报表系统、规则引擎和低代码平台的核心组件,其本质是将字符串形式的计算逻辑安全高效地转化为可执行代码。传统解释型引擎受限于重复解析与反射调用,性能瓶颈明显;而基于IL编译的方案通过复用.NET底层DynamicMethod机制,实现变量地址绑定、静态方法绑定与原生分支跳转,显著降低运行时开销。Flee作为成熟稳定的IL编译派代表,以轻量级设计(仅依赖mscorlib)、零Assembly加载、高缓存命中率等特性,在千万级报表场景中达成4.2倍于NCalc的执行效率。本文深入解析其编译原理、变量管理

diedangxiang4092的博客 328

C#表达式计算与公式引擎:词法、语法到递归下降求值

表达式计算是把一段公式字符串解析为可执行结构并求出数值的通用技术,核心环节包括词法分析、语法分析与求值。词法分析把字符切分为 Token,语法分析依据优先级和结合性构建表达式树或语法树,递归下降是常见实现方式;求值阶段再结合变量上下文、函数注册表与 decimal 精度控制得到结果。其技术价值在于把频繁变化的业务规则从硬编码中解耦,改配置即可生效,并通过白名单、错误位置、步数上限与超时机制提升可控性。典型场景包括折扣规则、税率计算、报表口径统一和用户自定义公式。围绕 C# 生态,DataTable.Comp

weixin_31236101的博客 108

PowerToys CalculatorEngineCommon 剖析:用 C++/WinRT 封装 exprtk 打造 CmdPal 计算引擎

CalculatorEngineCommon 是 Microsoft PowerToys 中一个典型的"原生组件"工程:它以单头文件表达式解析库 [exprtk](https://link.gitcode.com/i/7405304faaef2f0a09c2fa8ab2211c76) 为骨架,结合其 [IDL 接口](https://link.gitcode.com/i/fd775273b401e

gitblog_00677的博客 334

C#动态执行字符串,可以将字符串作为表达式执行

可以动态解析并执行字符串 参见http://blog.youkuaiyun.com/hsrzq/archive/2009/08/17/4456361.aspx 别忘了引用EvalGuy命名空间!

Windows 11 系统部署 OpenClaw 完整指南:从零到一的 AI 助手搭建

OpenClaw(昵称“小龙虾”)是一款开源 AI 代理工具,定位为“AI 指挥官”,能够接收指令、调用工具并自动化处理任务。它支持对接国内外多款大模型,所有数据本地存储,兼顾实用性与安全性。本文将详细介绍在 Windows 11 系统上部署 OpenClaw 的完整流程。OpenClaw 在 Windows 11 上的部署虽然有一定技术门槛,但按照本文的步骤操作,大多数用户都能顺利完成安装。环境准备是基础:确保 Node.js ≥22 版本,使用管理员权限操作安装方式灵活选择。

weixin_41484939的博客 800

C#反射与元数据性能陷阱及优化实战

反射是.NET中实现动态行为的基础机制,其底层依赖元数据解析、JIT编译和运行时类型检查,但这些操作在高频场景下会引发显著性能损耗。理解元数据表(如#TypeDef、#CustomAttribute)的懒加载机制、JIT对calli指令的保守优化策略,以及特性扫描的线性查找开销,是规避延迟飙升与GC压力的关键。技术价值在于将不可控的运行时开销转化为可预测的编译期或缓存化处理——Source Generators实现零反射序列化,Expression Trees生成内联级IL,而安全的MethodInfo缓存

unixboy 447

华为OD新系统机试真题-勇攀数字高峰(Java/Py/C/C++/Js/Go)

新系统 华为OD机试新系统【勇登数字高峰】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD新系统机试真题【勇登数字高峰】

qq_45776114的博客 1549

用PowerShell 3行代码打造可审计计算器,计算留痕不再算完就忘

日志审计是现代系统与数据处理中保障可追溯性的核心机制,通过记录操作痕迹实现可复现、可导出的完整证据链。在Windows平台,利用内置PowerShell脚本无需额外依赖即可构建轻量级的计算审计工具。其设计原理基于Invoke-Expression执行算术表达式、用Out-File以追加模式将带时间戳的输入与结果写入日志文件,从而实现每次计算的完整留痕。这一方案解决了普通计算器历史记录易丢失、过程不可见的问题,技术价值体现在过程证据的留存与复核效率的提升。实际应用中,无论是财务对账、批量数值核验,还是嵌入其他

weixin_42525385的博客 268

【本地部署实战】LM Studio深度使用指南:从环境搭建到模型调优

LM Studio通过极简的操作流程和强大的生态兼容性,让本地部署大模型成为可能。随着M4芯片的发布和CUDA 12.0的优化,未来本地化AI开发将迎来新的爆发点。建议开发者关注官方Discord社区(https://discord.gg/lmstudio)获取最新模型支持信息。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 8751

5、数据计算与处理技巧全解析

本文深入解析了Tableau中的多种数据计算与处理技巧,涵盖LOD计算、日期与字符串处理、计数优化、数据混合限制及自定义总计等核心内容。通过实际案例和流程图,系统讲解了各技巧的应用场景、实现步骤与注意事项,并提供性能优化建议和常见问题解答,帮助用户提升数据分析效率与可视化精度。同时展望了未来数据计算技术的发展趋势,是Tableau用户进阶必备的全面指南。

peach的博客 82

Grid++ Report 6.5在C# Winform工业报表中的深度实践

报表控件是桌面应用数据可视化的核心基础设施,其本质是将结构化数据通过模板引擎渲染为可打印、可导出的布局文档。Grid++ Report作为专为.NET Framework Winform设计的国产报表引擎,依托GDI+绘图与强类型DataSet绑定机制,提供高确定性、低依赖、一次买断的本地化报表能力。它不追求跨平台或Web兼容,而聚焦于工业现场对稳定性、字体可控性、高DPI适配及内存安全的硬性要求,特别适用于PLC数据汇总、MES客户端扩展、工控机单文件部署等典型场景。结合C#语言特性(如序号字段、Type

weixin_33997389的博客 408

Python 爬虫实战:全国高校录取分数线数据爬取与院校对比分析

本文介绍了一个基于Python的高考志愿填报辅助系统,通过爬取掌上高考平台的全国高校录取分数线数据,构建本地数据库并实现智能分析。系统主要功能包括:1)使用requests+BeautifulSoup爬取院校基本信息和历年分省分科类录取线;2)通过SQLite实现数据持久化与增量更新;3)利用pyecharts生成分数线趋势图、院校对比雷达图等可视化图表;4)提供"冲稳保"三档智能选校推荐。技术栈涵盖网络爬虫、数据清洗、数据库管理和可视化分析,可为考生提供数据驱动的志愿填报决策支持。项目采用模块化设计,包含

u014481728的博客 238

ESP-IDF 安装入门:一条命令装好环境,跑通第一个工程

本文带你把 ESP-IDF(乐鑫 IoT 开发框架)连同工具链一起装好。最优路径:用 v6.0 起随附的官方 EIM(ESP-IDF Installation Manager,开发环境的安装管家),一条 `eim install` 命令装好最新稳定版,或者在图形界面点五下鼠标。环境能跨机器复现,离线机器也有安装器,装完还能一键清理。 动手前先确认一个前置条件:机器上的 Python 不低于 3.

gitblog_00422的博客 637

【软考高项】【计算专题】- 3 - 进度类 - 双代号网络图

共需压缩 20 天。在双代号网络图中,工作一般使用箭线表示,任意一条箭线都需要占用时间、消耗资源,工作名称写在箭线的上方,而消耗的时间则写在箭线的下方或者工作后面。反映的是前后工作的交接点,节点中的编号可以任意编写,但应保证后续工作的节点比前面节点的编号大,即上图图中的1⃣️4⃣️ 即表示 B 活动和 D 活动间有依赖关系,D 活动的开始,依赖 B 活动的结束。B活动完成了一半, 各计划的实际支出为A活动6500元, B活动1000元, C活动280元, D。

欢迎来到我的博客,一起探索代码里的世界! 4561

利用恒源云云端GPU高效训练YOLOv11模型全流程:从环境搭建到模型部署,让你摆脱硬件束缚

记住,云端GPU的核心优势是“弹性算力+一键环境”,只要把握好这一工具特性,再结合YOLOv11的高性能模型架构,你也能在计算机视觉领域快速落地项目。接下来,我们从工具准备到模型部署,一步步带你实现高效训练,真正帮你解决资源与效率的核心痛点。凭借其在目标检测、实例分割任务上的卓越性能,成为众多开发者的首选。据统计,使用云端GPU训练YOLOv11,在处理百万级数据集时,训练效率较本地普通GPU提升。在安防监控中,YOLOv11可实时检测人员、车辆异常行为,某园区采用该方案后,异常事件识别准确率达。

LXY_LOVE36的博客 213

C++11可变参数模板、Lambda与std::function协同原理

可变参数模板是C++实现编译期泛型函数的核心机制,通过参数包递归展开与SFINAE支持类型安全的元编程;Lambda表达式并非语法糖,而是编译器生成的唯一闭包类型,提供轻量级、可捕获的函数对象;std::function则通过类型擦除统一各类可调用体接口,在事件系统、异步任务等场景中平衡灵活性与性能。三者共同构成现代C++函数式抽象的基础设施,支撑高内聚、低耦合的接口设计,广泛应用于回调封装、插件架构与跨模块通信。本文深入剖析其底层协作逻辑与工程落地要点。

weixin_30412167的博客 383

luks-磁盘加密工具

linux磁盘加密配置工具及步骤详解

zdd56789的博客 120

.NET动态委托优化:告别MethodInfo.Invoke性能瓶颈

在.NET中,动态执行用户输入的表达式(如数学公式)是常见需求,但直接使用反射调用MethodInfo.Invoke会导致严重性能损耗——99%以上耗时消耗在元数据查找与安全检查上。其本质是动态性与高性能的矛盾。通过动态生成强类型委托(如Func<double, double>),可将编译开销一次性完成,运行时获得接近原生方法的调用性能(约3纳秒)。该方案兼顾安全性、IDE智能提示与内存可控性,适用于教育绘图、金融风控、工业PLC等高频计算场景,是比Expression.Compile和Roslyn Scr

dejz8829的专栏 409

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

SQL Server参数化查询:安全高效处理IN和LIKE的实战方案

参数化查询是防止SQL注入、提升执行计划复用率的核心机制,其原理在于SQL Server编译期将参数视为类型明确的标量变量,生成可缓存的标准化执行计划。然而T-SQL语法限制导致WHERE IN和LIKE无法直接参数化——前者因IN子句要求编译期确定数量的标量表达式,后者因通配符位置影响索引选择与计划稳定性。技术价值体现在兼顾安全性(杜绝拼接风险)、性能(避免Ad-hoc计划爆炸)与可维护性(强类型校验、统一监控)。典型应用场景包括多选批量查询、前端模糊搜索、运营导出等高并发业务接口。本文聚焦SQL Ser

ciyinzhi8788的博客 518

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

上一篇: [转]NAT类型与检测
下一篇: [转]过滤规则推荐
SkyLee708
博客等级 码龄23年 10粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值