2017-06-05 2 views
0

のリストを受け取り、カスタムSUM関数を構築するためのより良い方法私は次のメソッド定義されました:

として使用することができます
public static Expression Sum(IList<Expression> expressions) 
{ 
    Expression result = expressions[0]; 
    foreach (var expression in expressions.Skip(1)) 
    { 
     result = Expression.Add(result, expression); 
    } 

    return result; 
} 

:追加するときしかし

var number1 = Expression.Constant(42.0); 
var number2 = Expression.Constant(10.0); 

var resultExpression = Sum(new { number1, number2 }); 
var value = Expression.Lambda(resultExpression).Compile().DynamicInvoke(); 

を表現の数が多い、私はパフォーマンスが大丈夫ではないと思う。

私はEnumerable.SumまたはQueryable.Sumを使用して作業を行うメソッドを作成できるかどうか疑問に思っていました。

+0

となり、なぜvar値= 42 + 10? ; P式を使用するための要件は何ですか? 2つの式、式のリスト、式のリスト、整数のリストを追加しますか? – JanDotNet

+3

なぜ2つの数値を合計するために式ツリーを使用していますか?式ツリーの主な用途は、Entity Framework(または同様のもの)で使用され、動的コード**を複数回再利用する必要があることです**。 – xanatos

+0

申し訳ありませんが、ここで何をしようとしていますか?パフォーマンスを向上させる最善の方法は、単一のコンパイルを行うことです。 –

答えて

1

私は、前のAdd式とあなたのリストの現在の式を使用するAggregateメソッドを再作成していると思います。コードを次のように変更してください:

return expressions.Aggregate((previousExpr, currentExpr) => Expression.Add(previousExpr, currentExpr)); 

これは高速ですが、よりクリーンです。 previousExprには、出力する合計が

+0

@StefHeyenrathそれから、コンパイル済みの式を生成した後にキャッシングしていない可能性があります。 – xanatos

+0

@xanatos提案はありますか? –

+0

ありがとうございます。さらに短いコードは以下のようになります:return expressions.Aggregate(Expression.Add); –