3

BinaryExpression で条件のリストを結合したいと考えています。問題は、そのようにすべての条件を同じレベルにしたいということです:

真 == 真と真 == 偽と真 == 真と真 == 真と真 == 真か真 == 偽と真 == 真と真 == 真と真 == 真と真 == 真と真 == 真または真 == 真

しかし、式は次のように生成されます。

((((((((((True == True) And (True == False)) And (True == True)) And (True == True)) And (True == True)) または(True == False)) And (True == True)) And (True == True)) And (True == True)) And (True == True)) And (True == True)) Or (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;
}
4

1 に答える 1

0

OR自分で s を遅らせることで、優先順位に対処できます。

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()か?) が、それはあなたに一般的なアイデアを与えるはずです.

于 2013-10-23T23:39:30.023 に答える