23

ForEach() メソッドはすべてのリスト メンバーをループするため、通常の foreach ループ内で使用できるのに、 break/continue句を使用できないのはなぜですか

lstTemp.ForEach(i=>
 {
   if (i == 3)
   break;
   //do sth
 }
);

エラー:

「中断または継続する囲みループがありません」

4

10 に答える 10

24

ForEachメソッドであり、通常のforeachループではないためです。このメソッドは、通常のループでForEach反復処理を中断または続行する必要がある場合に、単純なタスク用に用意されています。lstTempforeach

通常、ForEach次のように実装されます。

public static ForEach<T>(this IEnumerable<T> input, Action<T> action)
{
  foreach(var i in input)
    action(i);
}

これは通常のメソッド呼び出しであるためaction、囲んforeachでいる について何も知らないため、中断することはできません。

于 2010-12-14T12:26:38.947 に答える
17

おそらく、ラムダを使用しており、ラムダの内容がループ内で使用されているという事実を認識していないためです。

于 2010-12-14T12:23:22.737 に答える
10

ブレークを使用するのではなく、最初にこのようにフィルターを実行します (必要な正確なフィルターではないかもしれませんが、要点を示しています)

lstTemp.Where(i => i!= 3).ForEach(i=> // do sth);
于 2010-12-14T12:35:56.610 に答える
5

アイテムの一部のみを繰り返し、ブレークを完全にエミュレートするには、次を使用できますFirstOrDefault

lstTemp.FirstOrDefault(i=>
 {
   if (i == 3)
       return true;

   //do stuff

   return false;
 }
);

100000 アイテムのリストの場合、10 番目のアイテムが 3 の場合、10 回しか反復されず、Whereソリューションを使用しても機能しますが、最初にリスト全体を反復します。

于 2010-12-14T13:42:39.887 に答える
5

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

于 2015-09-06T04:45:10.373 に答える
4

私が説明する方法は次のとおりです。言語機能ではなく、ForEachメソッドです。C#コンストラクトは、他の言語が構築され、許可されている言語の機能です。foreachbreakcontinue

また、(判断しようとしているのではなく、ただ観察しているだけです) これは、一部の開発者がForEachメソッドの使用に反対する理由の良い例であることも指摘します。とにかく、すべての機能を備えているわけではありませforeachん。

私の意見では、ForEachメソッドが意味を持つ主なシナリオはIEnumerable<T>、メソッド呼び出しのチェーンの最後に -- を拡張することです。彼らがそれを に追加したのは (私には) 少し奇妙に思えList<T>ます。

于 2010-12-14T12:28:14.127 に答える
2

break と continue は、コンパイラのサポートを必要とする C# 言語のキーワードです。C# コンパイラにとって、ForEach は単なるメソッドです。

于 2010-12-14T12:27:57.717 に答える
0

リスト内の各アイテムのアクションを委任するためです。

于 2010-12-14T12:28:45.367 に答える