Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何创建;系统Linq.Expression“;带括号的动态表达式_C#_Linq_Dynamic_Expression - Fatal编程技术网

C# 如何创建;系统Linq.Expression“;带括号的动态表达式

C# 如何创建;系统Linq.Expression“;带括号的动态表达式,c#,linq,dynamic,expression,C#,Linq,Dynamic,Expression,我需要动态创建表达式。我的问题是如何在System.Linq.Expression中添加括号来处理优先级 inta=1,b=1,c=1,d=2 我已将下面的表达式转换为 var v = a > 1 || b > 1 && c > 1 || d > 1; Expression case1Expr = Expression.AndAlso( Expression.OrElse(

我需要动态创建表达式。我的问题是如何在System.Linq.Expression中添加括号来处理优先级

inta=1,b=1,c=1,d=2

我已将下面的表达式转换为

 var v = a > 1 || b > 1 && c > 1 || d > 1;
 Expression case1Expr =

                Expression.AndAlso(
                Expression.OrElse(
                Expression.GreaterThan(Expression.Parameter(typeof(int), "a"), Expression.Constant(1)),
                Expression.GreaterThan(Expression.Parameter(typeof(int), "b"), Expression.Constant(1))),


                Expression.OrElse(
                Expression.GreaterThan(Expression.Parameter(typeof(int), "c"), Expression.Constant(1)),
                Expression.GreaterThan(Expression.Parameter(typeof(int), "d"), Expression.Constant(1))));
但是如何转换一个带括号的

var v2 = (a > 1 || b > 1) && (c > 1 || d > 1);

我可能错过了你的问题,但你会不会:

Expression first = Expression.OrElse(
    Expression.GreaterThan(Expression.Parameter(typeof(int), "a"), Expression.Constant(1)),
    Expression.GreaterThan(Expression.Parameter(typeof(int), "b"), Expression.Constant(1)));

Expression second = Expression.OrElse(
    Expression.GreaterThan(Expression.Parameter(typeof(int), "c"), Expression.Constant(1)),
    Expression.GreaterThan(Expression.Parameter(typeof(int), "d"), Expression.Constant(1)));

Expression final = Expression.AndAlso(first, second);

结果是:
((a>1)或(b>1))和((c>1)或(d>1))
您已经拥有这些语义的代码。当您调用
ToString
查看您拥有的确切代码时,您会得到以下信息:

(((a > 1) OrElse (b > 1)) AndAlso ((c > 1) OrElse (d > 1)))

不需要特定的表达式来表示括号;括号在编写表达式时是隐式的。在代码中,您将
表达式传递给
表达式,因此
表达式将被括起来。

您可以通过构建表达式树的方式指定优先级。
&&
运算符通常优先于
|
运算符,因此您的转换将应用于带括号的表达式。否则就只会是:

var v = a > 1 || b > 1 && c > 1 || d > 1;

OrElse(
    GreaterThan(a > 1),

    OrElse(
      AndAlso(
        GreaterThan(b > 1),
        GreaterThan(c > 1)),
      GreaterThan(d > 1)))

只是对其他答案进行一点扩展;我们需要用括号来保持用来描述方程(A OP B)的中缀符号不含糊。其他符号,例如后缀(abop),不需要它


在您的例子中,您正在构建一个表达式树,它也是明确的,也就是说,只有一种方法可以解释它。所以表达式树中没有括号的概念。树的“形状”决定了操作的顺序。

这正是OP已经在做的事情;没有必要把这些值放在命名变量中。在问了这个问题之后,我也意识到了这一点,尝试一下out@Servy同意。我只是想说清楚。米兰,你可能想删除这个问题,因为你已经找到了答案