`foreach`ループの繰り返しをスキップするにはどうすればよいですか?


324

Perlでは、foreach(または任意のループ)の繰り返しをスキップできます。 next;コマンドを使用し。

反復をスキップしてC#の次のループにジャンプする方法はありますか?

 foreach (int number in numbers)
 {
     if (number < 0)
     {
         // What goes here to skip over the loop?
     }

     // otherwise process number
 }

悪い入力でユーザーに通知することは、それをスキップすることと同じくらい重要です!
有用なビー

回答:


664

あなたが欲しい:

foreach (int number in numbers) //   <--- go back to here --------+
{                               //                                |
    if (number < 0)             //                                |
    {                           //                                |
        continue;   // Skip the remainder of this iteration. -----+
    }

    // do work
}

continueキーワードの詳細は次のとおりです。


更新:コメントでのブライアンのフォローアップ質問に応えて:

forループをネストしていて、拡張されたものの1つの反復をスキップしたい場合、どうすればよいかをさらに明確にできますか?

for (int[] numbers in numberarrays) {
  for (int number in numbers) { // What to do if I want to
                                // jump the (numbers/numberarrays)?
  }
}

Aはcontinue常に最も近い外側のスコープに適用されるため、これを使用して最も外側のループから抜け出すことはできません。そのような状況が発生した場合、希望するものに応じて、より複雑なことを行う必要があります。break内側のループから外側のループまで、continueます。breakキーワードに関するドキュメントについては、こちらをご覧ください。breakC#のキーワードは、Perlに似ていますlastキーワード。

また、ダスティンの提案に従って、事前に処理したくない値だけを除外することを検討してください。

foreach (var basket in baskets.Where(b => b.IsOpen())) {
  foreach (var fruit in basket.Where(f => f.IsTasty())) {
    cuteAnimal.Eat(fruit); // Om nom nom. You don't need to break/continue
                           // since all the fruits that reach this point are
                           // in available baskets and tasty.
  }
}

forループをネストしていて、拡張されたものの1つの反復をスキップしたい場合、どうすればよいかをさらに明確にできますか?例:for(int []数値の数値配列){for(整数の数値){//(数値/数値配列)をジャンプしたい場合の対処方法}}
Brian

C#gotoは、@ Brianが尋ねている状況に実際に役立ちます。nextArray:外側のループの最下部などにラベルを追加してgoto nextArray;から、スキップします。
Jacob Krall

55

別のアプローチは、ループが実行される前にLINQを使用してフィルタリングすることです。

foreach ( int number in numbers.Where(n => n >= 0) )
{
    // process number
}

2
+1。これは質問への直接の回答ではありませんが、実際には、私が提案したものよりもおそらくこの解決策を好むでしょう。LINQの使用は、処理したくないループ値を除外するための良い一般的な使用例のようです。
John Feminella、2009年

3
これはより整然としていますか、それとも実際には、foreachの数が少ないという点でより速くなりますか?LINQは大幅に最適化されていると思いますが、LINQセクションはある時点でforeachする必要があるため、理論的には、データセットが大きく、結果の「フィルター処理された」サブセットがほぼ同じである場合、foreachが発生するため、これは遅くなります二回?それで、多分それは期待される結果のサブデータセットに依存しますか?
クーパー、2012

25

ifテストを反転することもできます。


foreach ( int number in numbers )
{
     if ( number >= 0 )
     {
        //process number
     }
 }

:)ありがとう!ループの最初に処理する必要のない基準と、捕捉する必要のあるエラーの基準があったため、基本的な例を思いつきました。
ブライアン

4
LINQベースの1つの答えは優れていて、エレガントですが、ifステートメントを使用するのは間違いありません。
crashmstr


16

continueステートメントを使用できます。

例えば:

foreach(int number in numbers)
{
    if(number < 0)
    {
        continue;
    }
}

16

linqを使用した別のアプローチは次のとおりです。

foreach ( int number in numbers.Skip(1))
{   
    // process number  
}

複数のアイテムの最初をスキップする場合。

または.SkipWhere、スキップする条件を指定する場合に使用します。


これは、これを行う最も簡単な方法です(多分、内部のロジックは同じです)。これで、Linqを使用できるようになりました。ただし、パフォーマンス上の理由から、.Skipが1回だけ呼び出されるようにする必要があります。(そうです、これはOPの質問に対する簡単な答えではありませんが、この答えのリストへの貴重な追加です)。+1
BチャールズH

8

continueステートメントを使用します。

foreach(object number in mycollection) {
     if( number < 0 ) {
         continue;
     }
  }

3
なぜ賛成されているのかわからない、彼は「番号」ではなく「o」をループするので間違っている
Fortune

同意しました、これは以前の回答のコピー/貼り付けですか?これはforeachなので概念的には価値がありますが、変数が一貫していることを確認してください。
Antonio Ciolino 2017年

0

これを行う最も簡単な方法は以下のとおりです。

//Skip First Iteration

foreach ( int number in numbers.Skip(1))

//Skip any other like 5th iteration

foreach ( int number in numbers.Skip(5))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.