二进制表达式组合

本文关键字:组合 表达式 二进制 | 更新日期: 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()吗?),但这应该给你一个大致的想法。