如何在C#中对包含关系和逻辑运算符的表达式进行求值?
C# 实现逻辑与关系混合表达式求值的方法
下面提供两种最常用的实现方案,覆盖不同场景的需求:
方案1:用表达式树实现(适合固定结构的表达式,性能最优)
.NET 内置的表达式树工具已经封装好了运算符优先级、括号逻辑、短路规则,不需要自己手动处理核心逻辑,示例代码如下:
using System; using System.Linq.Expressions; class Program { static void Main() { // 声明表达式中的变量参数,这里统一用int类型,可根据需求替换为其他数值类型 var aParam = Expression.Parameter(typeof(int), "a"); var bParam = Expression.Parameter(typeof(int), "b"); var cParam = Expression.Parameter(typeof(int), "c"); var dParam = Expression.Parameter(typeof(int), "d"); // 逐段构建示例表达式 (((a>b)&&(c<d))||(a==b)) var aGreaterB = Expression.GreaterThan(aParam, bParam); var cLessD = Expression.LessThan(cParam, dParam); var andClause = Expression.AndAlso(aGreaterB, cLessD); // && 短路逻辑与 var aEqualB = Expression.Equal(aParam, bParam); var finalExpr = Expression.OrElse(andClause, aEqualB); // || 短路逻辑或 // 编译为可直接调用的委托 var evaluateFunc = Expression.Lambda<Func<int, int, int, int, bool>>( finalExpr, aParam, bParam, cParam, dParam ).Compile(); // 测试调用,传入a=2, b=1, c=3, d=4 bool result = evaluateFunc(2, 1, 3, 4); Console.WriteLine(result); // 输出 True } }
优势:性能最高,支持自定义类型变量,适合表达式结构固定、需要高频调用的场景
方案2:用DataTable.Compute实现(适合动态字符串表达式,代码最简)
如果你的表达式是动态输入的字符串格式(比如用户直接输入(((a>b)&&(c<d))||(a==b))文本),可以用DataTable自带的计算方法,不需要手动解析语法:
using System; using System.Data; class Program { static void Main() { DataTable dt = new DataTable(); int a = 2, b = 1, c = 3, d = 4; // 拼接为完整的表达式字符串 string expressionStr = $"((({a}>{b})&&({c}<{d}))||({a}=={b}))"; // 直接计算并转换结果 bool result = Convert.ToBoolean(dt.Compute(expressionStr, "")); Console.WriteLine(result); // 输出 True } }
优势:代码量极小,不需要提前知道表达式结构,支持动态拼接的用户输入表达式,覆盖绝大多数常规求值需求
内容的提问来源于stack exchange,提问作者Sreenath Sreenivasan
相关产品推荐
相关产品推荐

