ForEach() メソッドはすべてのリスト メンバーをループするため、通常の foreach ループ内で使用できるのに、 break/continue句を使用できないのはなぜですか
lstTemp.ForEach(i=>
{
if (i == 3)
break;
//do sth
}
);
エラー:
「中断または継続する囲みループがありません」
ForEach
メソッドであり、通常のforeach
ループではないためです。このメソッドは、通常のループでForEach
反復処理を中断または続行する必要がある場合に、単純なタスク用に用意されています。lstTemp
foreach
通常、ForEach
次のように実装されます。
public static ForEach<T>(this IEnumerable<T> input, Action<T> action)
{
foreach(var i in input)
action(i);
}
これは通常のメソッド呼び出しであるためaction
、囲んforeach
でいる について何も知らないため、中断することはできません。
おそらく、ラムダを使用しており、ラムダの内容がループ内で使用されているという事実を認識していないためです。
ブレークを使用するのではなく、最初にこのようにフィルターを実行します (必要な正確なフィルターではないかもしれませんが、要点を示しています)
lstTemp.Where(i => i!= 3).ForEach(i=> // do sth);
アイテムの一部のみを繰り返し、ブレークを完全にエミュレートするには、次を使用できますFirstOrDefault
。
lstTemp.FirstOrDefault(i=>
{
if (i == 3)
return true;
//do stuff
return false;
}
);
100000 アイテムのリストの場合、10 番目のアイテムが 3 の場合、10 回しか反復されず、Where
ソリューションを使用しても機能しますが、最初にリスト全体を反復します。
ForEach はメソッドであり、通常の foreach ループではないため、ブレークの場合は通常の foreach ループで lstTemp を反復処理する必要がありますが、続行する場合は ForEach メソッド内で return を使用します。
var lstTemp = new List<int>() {1, 2, 3, 4};
lstTemp.ForEach(i=>
{
if (i == 3) return;
//do sth
Console.WriteLine(i);
});
出力: 1、2、4
私が説明する方法は次のとおりです。言語機能ではなく、ForEach
メソッドです。C#コンストラクトは、他の言語が構築され、許可されている言語の機能です。foreach
break
continue
また、(判断しようとしているのではなく、ただ観察しているだけです) これは、一部の開発者がForEach
メソッドの使用に反対する理由の良い例であることも指摘します。とにかく、すべての機能を備えているわけではありませforeach
ん。
私の意見では、ForEach
メソッドが意味を持つ主なシナリオはIEnumerable<T>
、メソッド呼び出しのチェーンの最後に -- を拡張することです。彼らがそれを に追加したのは (私には) 少し奇妙に思えList<T>
ます。
break と continue は、コンパイラのサポートを必要とする C# 言語のキーワードです。C# コンパイラにとって、ForEach は単なるメソッドです。
リスト内の各アイテムのアクションを委任するためです。