C # -Schleife - Pause vs. Weiter

797

Was ist der Unterschied zwischen break und continue in einer C # -Schleife (Sie können gerne für andere Sprachen antworten), um die Struktur der Schleife zu verlassen und zur nächsten Iteration zu gelangen?

Beispiel:

foreach (DataRow row in myTable.Rows)
{
    if (someConditionEvalsToTrue)
    {
        break; //what's the difference between this and continue ?
        //continue;
    }
}
Seibar
quelle
2
Blog-Beitrag mit Höhepunkt von unten adamthings.com/post/2012/07/26/…
Adam
8
continue;stoppt die Verarbeitung des aktuellen rowund fährt mit dem nächsten row aus der Sammlung fort. Auf der anderen Seite break;wird die foreachAnweisung vollständig verlassen und die verbleibenden Zeilen werden nie verarbeitet.
Jeppe Stig Nielsen

Antworten:

1500

breakverlässt die Schleife vollständig und überspringtcontinue nur die aktuelle Iteration.

Zum Beispiel:

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

    DoSomeThingWith(i);
}

Die Unterbrechung führt dazu, dass die Schleife bei der ersten Iteration beendet wird - DoSomeThingWithwird niemals ausgeführt. Das hier:

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

    DoSomeThingWith(i);
}

Wird nicht ausführen DoSomeThingWithfür i = 0, aber die Schleife wird fortgesetzt und DoSomeThingWithwird ausgeführt werden , i = 1zu i = 9.

Michael Stum
quelle
2
Warum gibt es keine Zahnspange mehr - ich weiß, dass es ohne sie funktioniert, aber warum?
George Willcox
52
@ GeorgeWillcox Mein jüngeres, dümmeres Ich hatte noch nicht gelernt, wie wichtig es ist, Zahnspangen zu verwenden. (Sie sind in C # für einzelne Anweisungen optional, aber wenn sie nicht eingefügt werden, ist es einfacher, später einen Fehler einzuführen. Siehe auch programmers.stackexchange.com/a/16530/6342 )
Michael Stum
386

Ein wirklich einfacher Weg, dies zu verstehen, besteht darin, das Wort "Schleife" nach jedem der Schlüsselwörter zu setzen. Die Begriffe sind jetzt sinnvoll, wenn sie nur wie alltägliche Sätze gelesen werden.

break Schleife - Schleife ist unterbrochen und stoppt.

continue loop - loop wird mit der nächsten Iteration weiter ausgeführt.

JeremiahClark
quelle
105

break bewirkt , dass der Programmzähler aus dem Bereich der innersten Schleife springt

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

Funktioniert so

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

Springe weiter bis zum Ende der Schleife. Springen Sie in einer for-Schleife weiter zum Inkrementausdruck.

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

    printf("%d", i);
}

Funktioniert so

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

    printf("%d", i);

    CONTINUE:;
}
Semikolon
quelle
2
Ich stelle fest, dass viele Loops hier nur die Standardschleife verwenden. Funktioniert fordies jedoch für vor und nach dem Test getestete whileLoops? Die gotoNotation lässt mich das glauben, muss aber überprüft werden.
Daniel Park
1
@ Daniel, für WHILE-Schleifen können Sie BREAK und CONTINUE verwenden, kein Problem.
Amila
@DanielPark Sowohl für while("vorab getestet") als auch für do- while(" nachgeprüft ") wird nach Erfüllung einer continue;Anweisung als Nächstes die Schleifenbedingung ausgewertet, um zu entscheiden, ob eine zusätzliche Iteration durchgeführt werden soll. Wenn break;die Schleifenbedingung nicht überprüft wird, wird die Schleife natürlich einfach vollständig verlassen. Die gotoAnalogie ist also auch gut, um diesen Aspekt zu verstehen.
Jeppe Stig Nielsen
37

Ich war immer verwirrt, ob ich break verwenden oder weitermachen sollte. Das hilft mir, mich zu erinnern:

Wann soll break vs continue verwendet werden?

  1. Pause - es ist wie eine Trennung . Es ist traurig, ihr trennt euch. Die Schleife wird beendet.

Brechen

  1. Weiter - bedeutet, dass Sie sich heute ausruhen und morgen alles klären werden (dh die aktuelle Iteration überspringen)!

Fortsetzen

BKSpurgeon
quelle
Wird dies mit meinem Partner teilen. Möglicherweise sollte Continue in GetOverIt umbenannt und Break in MoveOnForward umbenannt werden. Kein Wunder, dass wir Geeks genannt werden. Wie macht Break überhaupt Sinn? Es klingt destruktiv. Und eine, die hinzugefügt werden muss, ist - STOP oder noch besser EndIt - wird viele Fehler beheben und Cis wirklich scharf machen.
Mike
Wieder in die Flut Gleiche alte Reise war es damals Also machte ich einen großen Fehler Versuchen Sie es einmal auf meine Weise zu sehen
Talal Zahid
@ TalalZahid verstehe ich nicht?
BKSpurgeon
28

breakwürde die foreachSchleife vollständig stoppen , continuewürde zum nächsten springen DataRow.

Palmsey
quelle
20

Es gibt mehr als ein paar Leute , die nicht wie breakund continue. Die letzte Beschwerde, die ich über sie gesehen habe, war in JavaScript: The Good Parts von Douglas Crockford. Aber ich finde, dass die Verwendung einer davon manchmal die Dinge wirklich vereinfacht, besonders wenn Ihre Sprache keine do-whileoder eine do-untilArt von Schleife enthält.

Ich neige dazu, breakin Schleifen zu verwenden, die eine Liste nach etwas durchsuchen. Einmal gefunden, macht es keinen Sinn, fortzufahren, also können Sie genauso gut aufhören.

Ich verwende, continuewenn ich etwas mit den meisten Elementen einer Liste mache, möchte aber trotzdem einige überspringen.

Die breakAussage ist auch nützlich, wenn Sie nach einer gültigen Antwort von jemandem oder etwas fragen. Anstatt:

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

Sie könnten einige Duplikate beseitigen und verwenden:

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

Die do-untilzuvor erwähnte Schleife ist die elegantere Lösung für dieses spezielle Problem:

Do:
    Ask a question
    Until the answer is valid

Keine Vervielfältigung und auch nicht breakerforderlich.

Yukondude
quelle
13

Alle haben eine sehr gute Erklärung gegeben. Ich poste immer noch meine Antwort, um nur ein Beispiel zu geben, wenn das helfen kann.

// 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] ";
}

Hier ist die Ausgabe:

0 [Gedruckt] 1 [Gedruckt] 2 [Gedruckt]

Daher werden 3 [Gedruckt] und 4 [Gedruckt] nicht angezeigt, da bei i == 3 eine Unterbrechung auftritt

//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] ";
}

Hier ist die Ausgabe:

0 [Gedruckt] 1 [Gedruckt] 2 [Gedruckt] 4 [Gedruckt]

Daher wird 3 [Gedruckt] nicht angezeigt, da bei i == 3 fortgefahren wird

Pritom Nandy
quelle
7

Brechen

Break zwingt eine Schleife, sofort zu beenden.

Fortsetzen

Dies macht das Gegenteil von Pause. Anstatt die Schleife zu beenden, wird sie sofort erneut wiederholt, wobei der Rest des Codes übersprungen wird.

Sona
quelle
1
Weiter prüft auch die Schleifenbedingung :)
Grantly
1
Continueist nicht das Gegenteil von break, breakstoppt die Schleife, continuestoppt die aktuelle Iteration.
Steven
6

Einfache Antwort:

Break verlässt die Schleife sofort.
Weiter beginnt mit der Verarbeitung des nächsten Elements. (Wenn es welche gibt, springen Sie zur Bewertungszeile des for / while)

Maltrap
quelle
6

Zum Beispiel

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

Druckt 1, 2, 3 (in separaten Zeilen).

Fügen Sie eine Unterbrechungsbedingung bei i = 2 hinzu

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

    Console.WriteLine(i);
}

Jetzt druckt die Schleife 1 und stoppt.

Ersetzen Sie die Pause durch eine Fortsetzung.

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

    Console.WriteLine(i);
}

Nun werden die Drucke 1 und 3 wiederholt (2 übersprungen).

Somit breakstoppt die Schleife, während continuespringt zum nächsten Iteration.

Oberst Panik
quelle
5

Ruby ist leider etwas anders. PS: Mein Gedächtnis ist etwas verschwommen, also entschuldige mich, wenn ich falsch liege

Anstelle von break / continue gibt es break / next, die sich in Bezug auf Schleifen gleich verhalten

Schleifen (wie alles andere auch) sind Ausdrücke und "geben" das Letzte zurück, was sie getan haben. Meistens ist es sinnlos, den Rückgabewert aus einer Schleife zu erhalten, also macht das einfach jeder

a = 5
while a < 10
    a + 1
end

Sie können dies jedoch tun

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

JEDOCH "emuliert" viel Ruby-Code eine Schleife mithilfe eines Blocks. Das kanonische Beispiel ist

10.times do |x|
    puts x
end

Da es viel häufiger vorkommt, dass Menschen Dinge mit dem Ergebnis eines Blocks tun möchten, wird es hier unordentlich. break / next bedeuten verschiedene Dinge im Kontext eines Blocks.

break springt aus dem Code heraus, der den Block aufgerufen hat

next überspringt den Rest des Codes im Block und gibt das, was Sie angeben, an den Aufrufer des Blocks zurück. Ohne Beispiele macht das keinen Sinn.

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.

Also ja. Ruby ist großartig, aber es gibt einige schreckliche Eckfälle. Dies ist das zweitschlechteste, das ich in meinen Jahren gesehen habe :-)

Orion Edwards
quelle
5

Bitte lassen Sie mich das Offensichtliche sagen: Beachten Sie, dass das Hinzufügen von weder break noch continue Ihr Programm fortsetzt. Das heißt, ich habe einen bestimmten Fehler abgefangen. Nachdem ich ihn protokolliert hatte, wollte ich die Verarbeitung fortsetzen, und zwischen der nächsten Zeile befanden sich weitere Codeaufgaben, sodass ich ihn einfach durchfallen ließ.

David Hall
quelle
3

Um vollständig aus einer foreach-Schleife auszubrechen , wird break verwendet.

Um zur nächsten Iteration in der Schleife zu gelangen, wird continue verwendet.

Break ist nützlich, wenn Sie eine Sammlung von Objekten (z. B. Zeilen in einer Datentabelle) durchlaufen und nach einer bestimmten Übereinstimmung suchen. Wenn Sie diese Übereinstimmung finden, müssen Sie die verbleibenden Zeilen nicht weiter durchlaufen, sodass Sie eine Pause einlegen möchten aus.

Weiter ist nützlich, wenn Sie in einer Schleifeniteration das erreicht haben, was Sie benötigen. Normalerweise müssen Sie nach einem Wenn fortfahren .

Gopesh Sharma
quelle
2

Wenn Sie break nicht verwenden möchten, erhöhen Sie einfach den Wert von I so, dass die Iterationsbedingung falsch wird und die Schleife bei der nächsten Iteration nicht ausgeführt wird.

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
}
Umair Khalid
quelle
0

Wie für andere Sprachen:

'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
dba
quelle