C# 二进制表达式组合
我想在二进制表达式中组合条件列表。问题是我希望所有条件都处于同一级别,这样: 真==真与真==真与真==真与真==真与真==真或真==假与真==真与真==真与真==真与真==真与真==真或真==真C# 二进制表达式组合,c#,C#,我想在二进制表达式中组合条件列表。问题是我希望所有条件都处于同一级别,这样: 真==真与真==真与真==真与真==真与真==真或真==假与真==真与真==真与真==真与真==真与真==真或真==真 var currentExpr = this.MakeExpression(list.First()); foreach (bool obj in list.Skip(1)) { var nextExpr = this.MakeExpression(obj); switch (type
var currentExpr = this.MakeExpression(list.First());
foreach (bool obj in list.Skip(1))
{
var nextExpr = this.MakeExpression(obj);
switch (type)
{
case 1: // And
currentExpr = Expression.And(currentExpr, nextExpr);
break;
case 2: // Or
currentExpr = Expression.Or(currentExpr, nextExpr);
break;
}
}
private BinaryExpression MakeExpression(bool value)
{
BinaryExpression expression = Expression.Equal(Expression.Constant(true),Expression.Constant(value));
return expression;
}
但表达式是生成的:
()(((((()(((真==真)和(真==真))和(真==真)和(真==真)和(真==真))或(真==真))
您可以通过延迟
或来处理优先级:
var andExprs = new List<BinaryExpression>();
andExprs.Add(this.MakeExpression(list.First()));
foreach (bool obj in list.Skip(1))
{
var nextExpr = this.MakeExpression(obj);
switch (type)
{
case 1: // And
andExprs[andExprs.Count-1] = Expression.And(andExprs[andExprs.Count-1], nextExpr);
break;
case 2: // Or
andExprs.Add(nextExpr);
break;
}
}
var currentExpr = andExprs.First();
foreach (var expr in andExprs.Skip(1))
{
currentExpr = Expression.Or(currentExpr, expr);
}
var andExprs=newlist();
andExprs.Add(this.MakeExpression(list.First());
foreach(列表中的bool obj.Skip(1))
{
var nextExpr=this.MakeExpression(obj);
开关(类型)
{
案例1://和
andExprs[andExprs.Count-1]=表达式和(andExprs[andExprs.Count-1],nextExpr);
打破
案例2://或
andExprs.Add(nextExpr);
打破
}
}
var currentExpr=andExprs.First();
foreach(在andExprs.Skip(1)中的var expr)
{
currentExpr=表达式或(currentExpr,expr);
}
我现在无法测试代码,因此可能会出现输入错误(是否和xprs.Count
需要和xprs.Count()
?),但这应该会给您提供大致的想法。您是否尝试过和或或?这些都是在同一个层次上的。是的,发生了同样的问题。我不明白这个问题。必须有一些优先权。隐式或显式地。就像在c#中编写条件语句一样,我也质疑您希望如何处理运算符优先级,例如,使用here is what find(禁用换行以使其正确显示)可能我遗漏了什么。如果所有表达式都在同一级别上,那么通常的C#运算符优先级不适用吗?然后,将在或
s之前执行和
s。