2009-03-17 7 views
247

Perlでは、next;コマンドでforeach(または任意のループ)反復をスキップできます。`foreach`ループの繰り返しをスキップするにはどうしたらいいですか?

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

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

    // otherwise process number 
} 
+0

悪い入力でユーザーに通知することは、スキップするほど重要です! – usefulBee

答えて

514

あなたが欲しい:

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

    // do work 
} 

はここcontinue keywordについての詳細です。


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

あなたはさらに私はforループネストされた、と繰り返しをスキップするように望んでいた場合、私はどうなるのかを明確でした拡張されたものの一つ?

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

continueは常に最も近い囲みスコープに適用されますので、あなたは、最も外側のループから抜け出すためにそれを使用することができませんでした。そのような状況が発生した場合は、内側のループからbreak、外側のループでcontinueのように、あなたが望むものに応じてもっと複雑なものを行う必要があります。 break keywordに関するドキュメントはこちらをご覧ください。 break C#キーワードは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. 
    } 
} 
+0

ループ用にネストしていて、拡張されたループの繰り返しをスキップしたい場合は、私が何をするのかをさらに明確にすることができますか? 例:(numberarraysのint []の数字)のための {(数字のint番号)について { // } (数字/ numberarrays)をジャンプしたい場合にどうするか} – Brian

+0

C#の 'goto'を@Brianが尋ねている状況で実際に役に立ちます。外側のループの最後に 'nextArray:'のようなラベルを追加し、スキップしたいときは 'goto nextArray;'を追加します。 –

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

    //otherwise process number 
} 
7

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

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

なぜそれがアップヴォートされているのか分かりませんが、これは間違っています。なぜなら、 "数字"ではなく "o"をループしているからです。 – Fortune

+0

合意は多分、これまでの回答からコピー/概念的には価値がありますが、変数が一貫していることを確認してください。 –

12

あなたはcontinueステートメントを使用することができます。例えば

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

テスト場合にも、あなたを反転できます。


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

:)ありがとう!ループの始めに処理する必要のないいくつかの基準と、捕捉する必要があったエラーの基準があるため、私は基本的な例を考え出します。 – Brian

+0

'continue'を使用しない場合は+1 – Trap

+4

もう使用しないでくださいifs :( – Custodio

43

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

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

+1。実際には、私が提案したものに対してこの解決策を好むかもしれません.LINQを使うことは、処理したくないループ値をフィルタリングするための一般的なユースケースのようです。 –

+3

これはちょっとしたものですか?私はLINQが非常に最適化されていると推測していますが、LINQセクションは、理論的には、データセットが大きく、結果としてフィルタリングされたサブセットが大規模な場合、foreachが2回起こらなければならないので、これは遅くなるでしょうか?それはおそらく予想される結果のサブデータセットに依存しますか? – Coops

12

別のアプローチlinqを使用しています:

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

最初の項目をスキップする場合は、いくつかの項目を選択します。

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

関連する問題