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);
return
は、continue
でForEach
として機能します。
例:
var list = new List<int>() {1, 2, 3, 4};
list.ForEach(i =>
{
if (i == 3)
return;
Console.WriteLine(i);
}
);
1、2、4を印刷します。
3-スキップしました。
アイテムの一部のみを繰り返し、ブレークを完全にエミュレートするには、FirstOrDefault
を使用できます。
lstTemp.FirstOrDefault(i=>
{
if (i == 3)
return true;
//do stuff
return false;
}
);
100000アイテムのリストの場合、10番目のアイテムが3の場合、Where
ソリューションを使用して10回だけ反復しますが、最初にリスト全体を反復します。
私が説明する方法は次のとおりです。ForEach
はメソッドであり、言語機能ではありません。 C#foreach
構造は、他の言語構造break
およびcontinue
が許可されている言語の機能です。
また、これは、一部の開発者がForEach
メソッドの使用に反対する理由の良い例であることも指摘します(判断しようとせず、観察するだけです)。場合によっては、必要以上にリダイレクトが1つ必要であり、とにかくforeach
のすべての機能を備えているわけではありません。
私の意見では、ForEach
メソッドが理にかなっている主なシナリオは、IEnumerable<T>
--の拡張としてメソッド呼び出しのチェーンの最後に置くことです。彼らがそれをList<T>
に追加したのは(私には)少し奇妙に思えます。
breakとcontinueは、コンパイラのサポートを必要とするC#言語のキーワードです。 ForEachは、C#コンパイラにとっては単なるメソッドです。
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
リスト内の各アイテムのアクションを委任するためです。
Function<T, bool>
を受け取り、falseの場合に停止する拡張メソッド「ForEachWhile」を記述できます。