3

ラムダ式はコンパイル時に評価されるため、以下のコードは 100 個の異なる関数を生成しません。上記の効果を達成するための簡単なメカニズムはありますか?これはパフォーマンスの点であまり効率的ではないことを認識しています。

List<Action> actions = new List<Action>();
for (int i = 0; i < 100; ++i)
    actions.Add(() => Execute(100100100 + i));
4

2 に答える 2

2

このコードは、変更された変数を閉じるため、実行したいことを実行しません。i次のように、 の値の一時変数を追加する必要があります。

List<Action> actions = new List<Action>();
for (int i = 0; i < 100; ++i) {
    int temp = i;
    actions.Add(() => Execute(100100100 + temp));
}

100 個の個別のラムダを作成するには、LINQ 式を作成して を呼び出しExecute、定数を 1 つずつ作成して、ラムダをコンパイルします。ただし、これによってパフォーマンスが大幅に向上することはまずありません。方法は次のとおりです。

var exec = typeof(Test).GetMethod("Execute"); // <<== Use your type here
var actions = new List<Action>();
for (int i = 0 ; i != 100 ; i++) {
    var val = Expression.Constant(i+100100100);
    // This assumes that Execute(int) is static.
    // For non-static calls use a different overload.
    var call = Expression.Call(exec, val);
    var lambda = Expression.Lambda(typeof(Action), call, new ParameterExpression[0]);
    actions.Add((Action)lambda.Compile());
}

これは ideone のデモです

于 2013-08-25T15:56:18.547 に答える