二进制表达式组合

时间:2013-10-23 23:10:26

标签: c#

我想在BinaryExpression中组合条件列表。问题是我希望所有条件都处于同一水平,即:

真==真和真= =假和真==真和真==真和真==真或真==假和真==真和真==真和真==真和真= =真和真==真或真==真

但表达式已生成:

(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( ))或(True == False))和(True == True))和(True == True))和(True == True))和(True == True))和(True == True))或(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;
}

1 个答案:

答案 0 :(得分:0)

您可以通过自己延迟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()吗?)但是这应该会给你一般的想法。