C#ループ-中断と継続


797

C#(他の言語についてはお気軽に回答してください)ループで、ループの構造を離れて次の反復に進む手段としてのブレークと継続の違いは何ですか?

例:

foreach (DataRow row in myTable.Rows)
{
    if (someConditionEvalsToTrue)
    {
        break; //what's the difference between this and continue ?
        //continue;
    }
}

2
以下の集大成とポストをブログadamthings.com/post/2012/07/26/...
アダム

8
continue;現在の処理を停止し、コレクションから次の処理をrow続行します。一方、去る完全に声明をし、残りの行が処理されることはありません。 rowbreak;foreach
Jeppe Stig Nielsen

回答:


1500

break、完全にループを終了しますcontinueちょうどますスキップ現在の反復を。

例えば:

for (int i = 0; i < 10; i++) {
    if (i == 0) {
        break;
    }

    DoSomeThingWith(i);
}

ブレークにより、ループは最初の反復で終了します- DoSomeThingWith実行されることはありません。これはここです:

for (int i = 0; i < 10; i++) {
    if(i == 0) {
        continue;
    }

    DoSomeThingWith(i);
}

は実行さDoSomeThingWithれませんi = 0が、ループは継続しますDoSomeThingWithのために実行されますi = 1までi = 9


2
なぜ彼らの周りに中括弧がないのですか?私はそれがそれらなしで機能することを知っていますが、なぜですか?
ジョージウィルコックス2016

52
@GeorgeWillcox私の若い、もっと愚かな自分は、いつも中括弧を使うことの価値をまだ学んでいませんでした。(これらはC#では単一ステートメントのオプションですが、それらを配置しないと、後でバグが発生しやすくなります。また、programmers.stackexchange.com / a /
16530/6342

386

これを理解する本当に簡単な方法は、各キーワードの後に​​「ループ」という単語を置くことです。これらの用語は、日常のフレーズのように読むだけで意味をなすようになりました。

break loop-ループは壊れて停止します。

continue loop-ループは次の反復で実行を続けます。


105

breakは、プログラムカウンターを最も内側のループのスコープからジャンプさせます。

for(i = 0; i < 10; i++)
{
    if(i == 2)
        break;
}

このように機能します

for(i = 0; i < 10; i++)
{
    if(i == 2)
        goto BREAK;
}
BREAK:;

continueはループの終わりにジャンプします。forループで、continueはインクリメント式にジャンプします。

for(i = 0; i < 10; i++)
{
    if(i == 2)
        continue;

    printf("%d", i);
}

このように機能します

for(i = 0; i < 10; i++)
{
    if(i == 2)
        goto CONTINUE;

    printf("%d", i);

    CONTINUE:;
}

2
ここで多くのループが標準forループを使用していることに気づきましたが、これは事前および事後テスト済みwhileループで機能しますか?goto表記はそう信じて私をリードし、いくつかの検証が必要です。
Daniel Park

1
@ Daniel、WHILEループの場合、BREAKとCONTINUEを使用できます。問題ありません。
Amila

@DanielPark while(「事前テスト済み」)とdo- while(「事後テスト済み」)の両方について、continue;ステートメントが満たされた後、ループ条件が評価され、追加の反復が実行されるかどうかが決定されます。もちろん、break;ループ条件がチェックされていない場合、ループは完全に終了します。したがって、このgoto類似性はこの側面を理解するのにも適しています。
Jeppe Stig Nielsen 2017

37

私は、休憩を使用するか、続行するかを常に混乱させていました。これは私が覚えているのに役立ちます:

いつブレーク対コンティニューを使用するのですか?

  1. 休憩 -それは解散のようなものです。悲しいです、あなた達は別れます。ループは終了します。

ブレーク

  1. 続行 -今日は休憩して、明日はすべて並べ替えます(つまり、現在の反復をスキップします)。

継続する


これを私のパートナーと共有します。May be ContinueはGetOverItに名前を変更し、BreakはMoveOnForwardに名前を変更する必要があります。私たちがオタクと呼ばれているのも不思議ではありません。それは破壊的に聞こえます。そして、追加する必要があるのは-STOP、またはさらに優れたEndIt-は多くのバグを修正し、C-sharpを本当にシャープにするでしょう。
マイク

それが戻っていた洪水再び同じ古い旅行にそのように私は私の道一度それを見るために大きな間違いトライをした
タラルZahid

@TalalZahidわからない?
BKSpurgeon

28

breakforeachループを完全に停止continueし、次へスキップしDataRowます。


20

breakand が気に入らない人は少なくありませんcontinue。私がそれらについて見た最新の不満はJavaScriptにありました: Douglas CrockfordによるThe Good Partsです。ただし、特に言語にa do-whileまたはorが含まれていない場合、do-untilにループループのスタイルがあります。

使いやすい breakリストを検索するループでます。見つかったら、続行しても意味がないので、終了することもできます。

私が使う continueリストのほとんどの要素で何かときが、それでもいくつかはスキップしたいと思います。

このbreakステートメントは、誰かまたは何かからの有効な応答をポーリングするときにも役立ちます。の代わりに:

Ask a question
While the answer is invalid:
    Ask the question

いくつかの重複を排除して使用することができます:

While True:
    Ask a question
    If the answer is valid:
        break

do-until私は前に述べたことをループは、その特定の問題のために、よりエレガントなソリューションです。

Do:
    Ask a question
    Until the answer is valid

重複も、break必要もありません。


13

すべては非常に良い説明をしました。それが役立つかどうかの例を示すために、私はまだ答えを投稿しています。

// break statement
for (int i = 0; i < 5; i++) {
    if (i == 3) {
        break; // It will force to come out from the loop
    }

    lblDisplay.Text = lblDisplay.Text + i + "[Printed] ";
}

出力は次のとおりです。

0 [印刷済み] 1 [印刷済み] 2 [印刷済み]

したがって、3 = [Printed]&4 [Printed]は、i == 3のときにブレークがあるため表示されません。

//continue statement
for (int i = 0; i < 5; i++) {
    if (i == 3) {
        continue; // It will take the control to start point of loop
    }

    lblDisplay.Text = lblDisplay.Text + i + "[Printed] ";
}

出力は次のとおりです。

0 [印刷済み] 1 [印刷済み] 2 [印刷済み] 4 [印刷済み]

したがって、3 = [印刷済み]は、i == 3のときに継続があるため表示されません。


7

ブレーク

Breakは、ループをすぐに終了させます。

継続する

これは休憩の反対を行います。ループを終了する代わりに、すぐに再びループし、残りのコードをスキップします。


1
ループ状態も引き続きチェックします:)
Grantly

1
Continue反対ではないbreakbreakループを停止し、continue現在の反復を停止します。
Steven

6

簡単な答え:

Breakはすぐにループを終了します。
続行して次のアイテムの処理を開始します。(存在する場合は、for / whileの評価行にジャンプします)


6

例として

foreach(var i in Enumerable.Range(1,3))
{
    Console.WriteLine(i);
}

1、2、3を(別々の行に)印刷します。

i = 2にブレーク条件を追加する

foreach(var i in Enumerable.Range(1,3))
{
    if (i == 2)
        break;

    Console.WriteLine(i);
}

これでループは1を出力して停止します。

休憩を継続に置き換えます。

foreach(var i in Enumerable.Range(1,3))
{
    if (i == 2)
        continue;

    Console.WriteLine(i);
}

次に、印刷1と3をループします(2をスキップします)。

したがって、breakループを停止continueし、次の反復にスキップします。


5

Rubyは残念ながら少し異なります。PS:私の記憶はこれで少しかすんでいるので、私が間違っているとすみません

break / continueの代わりに、break / nextがあり、ループに関して同じように動作します。

ループは(他のすべてと同様に)式であり、ループが行った最後のことを「返す」。ほとんどの場合、ループからの戻り値の取得は無意味なので、誰もがこれを行うだけです

a = 5
while a < 10
    a + 1
end

あなたはこれを行うことができます

a = 5
b = while a < 10
    a + 1
end # b is now 10

ただし、多くのルビコードは、ブロックを使用してループを「エミュレート」します。正規の例は

10.times do |x|
    puts x
end

ブロックの結果を使って物事をやりたがる方がはるかに一般的であるので、ここが乱雑になる場所です。break / nextは、ブロックのコンテキストで異なることを意味します。

ブレークは、ブロックを呼び出したコードからジャンプします

nextは、ブロック内の残りのコードをスキップし、指定したものをブロックの呼び出し元に「返します」。これは例がなければ意味がありません。

def timesten
    10.times{ |t| puts yield t }
end


timesten do |x|
   x * 2
end
# will print
2
4
6
8 ... and so on


timesten do |x|
    break
    x * 2
end
# won't print anything. The break jumps out of the timesten function entirely, and the call to `puts` inside it gets skipped

timesten do |x|
    break 5
    x * 2
end
# This is the same as above. it's "returning" 5, but nobody is catching it. If you did a = timesten... then a would get assigned to 5

timesten do |x|
    next 5
    x * 2
end 
# this would print
5
5
5 ... and so on, because 'next 5' skips the 'x * 2' and 'returns' 5.

そうそう。Rubyは素晴らしいですが、ひどいコーナーケースがあります。これは、私が長年使用してきた中で2番目に悪いものです:-)


5

明言させてください。ブレークも継続も追加しないと、プログラムが再開されます。つまり、特定のエラーをトラップし、それをログに記録した後、処理を再開したかったのですが、次の行の間にさらにコードタスクがあったため、そのままにしておきました。


3

foreachループを完全に解除するには、breakを使用します。

ループの次の反復に進むには、continueが使用されます。

Breakは、オブジェクトのコレクション(Datatableの行など)をループしていて、特定の一致を検索している場合に役立ちます。一致が見つかった場合、残りの行を続行する必要がないため、ブレークしたいアウト。

継続は、ループの繰り返しで必要なことを完了したときに役立ちます。通常はifの後に続行します。


2

使いたくない場合 break、反復条件がfalseになり、ループが次の反復で実行されないように、Iの値を増やすだけです。

for(int i = 0; i < list.Count; i++){
   if(i == 5)
    i = list.Count;  //it will make "i<list.Count" false and loop will exit
}

0

他の言語に関しては:

'VB
For i=0 To 10
   If i=5 then Exit For '= break in C#;
   'Do Something for i<5
next

For i=0 To 10
   If i=5 then Continue For '= continue in C#
   'Do Something for i<>5...
Next
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.