web-dev-qa-db-ja.com

ForEach():内部でbreak / continueを使用できないのはなぜですか

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

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

エラー:

「中断または続行するための囲みループはありません」

15
Rami Shareef

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について何も知らないため、中断することはできません。

20
Femaref

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

17
acron

ブレークを使用するのではなく、最初にこのようにフィルターを実行します(必要なフィルターとは異なる場合がありますが、要点を示しています)

lstTemp.Where(i => i!= 3).ForEach(i=> // do sth);
10
Dean Chalk

returnは、continueForEachとして機能します。

例:

var list = new List<int>() {1, 2, 3, 4};
list.ForEach(i => 
    {
        if (i == 3)
            return;
        Console.WriteLine(i);
    }
);

1、2、4を印刷します。

3-スキップしました。

9
TarasB

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

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

   //do stuff

   return false;
 }
);

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

5
Shadow Wizard

私が説明する方法は次のとおりです。ForEachメソッドであり、言語機能ではありません。 C#foreach構造は、他の言語構造breakおよびcontinueが許可されている言語の機能です。

また、これは、一部の開発者がForEachメソッドの使用に反対する理由の良い例であることも指摘します(判断しようとせず、観察するだけです)。場合によっては、必要以上にリダイレクトが1つ必要であり、とにかくforeachのすべての機能を備えているわけではありません。

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

4
Dan Tao

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

2
Mattias S

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

1
LeoLana

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

0
Ralf de Kleine

Function<T, bool>を受け取り、falseの場合に停止する拡張メソッド「ForEachWhile」を記述できます。

0
Guillaume86