二进制表达式组合
本文关键字:组合 表达式 二进制 | 更新日期: 2023-09-27 18:36:49
我想在 BinaryExpression 中组合一个条件列表。问题是我希望所有条件都在同一级别,这样:
真 == 真和真 == 假和真 == 真和真 == 真和真 == 真或真 == 假和真 == 真和真 == 真和真 == 真和真 == 真和真 == 真和真 == 真或真 == 真
但是生成表达式:
((true == true) and (true == false)) and (true == true)) and (true == true)) and (true == true)) or (true == false)) and (true == true)) and (true == true)) and (true == true)) and (true == true)) and (true == true)) and (true == true)) and (true == true))or (true == true)
)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;
}
您可以通过自己延迟OR
来处理优先级:
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);
}
我现在无法测试代码,所以可能存在拼写错误(andExprs.Count
需要andExprs.Count()
吗?),但这应该给你一个大致的想法。