ラムダ式はコンパイル時に評価されるため、以下のコードは 100 個の異なる関数を生成しません。上記の効果を達成するための簡単なメカニズムはありますか?これはパフォーマンスの点であまり効率的ではないことを認識しています。
List<Action> actions = new List<Action>();
for (int i = 0; i < 100; ++i)
actions.Add(() => Execute(100100100 + i));
ラムダ式はコンパイル時に評価されるため、以下のコードは 100 個の異なる関数を生成しません。上記の効果を達成するための簡単なメカニズムはありますか?これはパフォーマンスの点であまり効率的ではないことを認識しています。
List<Action> actions = new List<Action>();
for (int i = 0; i < 100; ++i)
actions.Add(() => Execute(100100100 + i));
このコードは、変更された変数を閉じるため、実行したいことを実行しません。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());
}