C# loop-break vs. continue

W pętli C# (w innych językach), jaka jest różnica między break a continue jako sposobem na opuszczenie struktury pętli i przejście do następnej iteracji?

Przykład:

foreach (DataRow row in myTable.Rows)
{
    if (someConditionEvalsToTrue)
    {
        break; //what's the difference between this and continue ?
        //continue;
    }
}
Author: callisto, 2008-08-09

15 answers

break continuepo prostu pomija bieżącą iterację.

Na przykład:

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

    DoSomeThingWith(i);
}

Przerwa spowoduje zamknięcie pętli podczas pierwszej iteracji - DoSomeThingWith nigdy nie zostanie wykonana. To tutaj:

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

    DoSomeThingWith(i);
}

Nie wykona DoSomeThingWith dla i = 0, ale pętla będzie kontynuowana, a DoSomeThingWith będzie wykonywana dla i = 1 do i = 9.

 1327
Author: Michael Stum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-08 17:21:23

Naprawdę łatwym sposobem na zrozumienie tego jest umieszczenie słowa "loop" po każdym ze słów kluczowych. Terminy mają teraz sens, jeśli są po prostu czytane jak codzienne zwroty.

break pętla-pętla jest przerwana i zatrzymuje się.

continue loop-pętla kontynuuje wykonywanie z następną iteracją.

 366
Author: JeremiahClark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-04 18:27:22

Break powoduje, że licznik programu wyskakuje poza zakres najbardziej wewnętrznej pętli

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

Działa tak

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

Kontynuuj skoki do końca pętli. W pętli for Kontynuuj skoki do wyrażenia przyrostowego.

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

    printf("%d", i);
}

Działa tak

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

    printf("%d", i);

    CONTINUE:;
}
 92
Author: SemiColon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-19 20:21:17

break całkowicie zatrzyma pętlę foreach, continue przeskoczy do następnego DataRow.

 24
Author: palmsey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-04 18:28:05

Jest więcej niż kilka osób, które nie lubią break i continue. Ostatnia skarga, którą widziałem na ich temat, była w JavaScript: the Good Parts autorstwa Douglasa Crockforda. Ale uważam, że czasami używanie jednego z nich naprawdę upraszcza rzeczy, zwłaszcza jeśli twój język nie zawiera do-while lub do-until stylu pętli.

Używam break w pętlach, które szukają czegoś na liście. Po znalezieniu nie ma sensu kontynuować, więc równie dobrze możesz zrezygnować.

Używam continue gdy robisz coś z większością elementów listy, ale nadal chcesz pominąć kilka.

Wypowiedź break przydaje się również podczas sondażu na poprawną odpowiedź od kogoś lub czegoś. Zamiast:

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

Można by wyeliminować powielanie i używać:

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

Pętla do-until, o której wspomniałem wcześniej, jest bardziej eleganckim rozwiązaniem tego konkretnego problemu:

Do:
    Ask a question
    Until the answer is valid

Brak duplikacji i nie potrzeba break.

 18
Author: yukondude,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-08 22:35:46

Wszyscy dali bardzo dobre wyjaśnienie. Nadal zamieszczam swoją odpowiedź, aby dać przykład, jeśli to może pomóc.

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

Oto Wyjście:

0[Wydrukowano] 1 [Wydrukowano] 2 [Wydrukowano]

Więc 3[drukowane] & 4 [Drukowane] nie będą wyświetlane, ponieważ jest przerwa, gdy 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] ";
}

Oto Wyjście:

0[Wydrukowano] 1 [Wydrukowano] 2 [Wydrukowano] 4 [Wydrukowano]

Więc 3 [Drukowane] nie będą wyświetlane, ponieważ jest kontynuacja, gdy i == 3

 12
Author: Pritom Nandy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-28 13:41:50

Zawsze byłem zdezorientowany, czy powinienem używać break, czy continue. To mi pomaga zapamiętać:

Kiedy używać break vs continue?

  1. Przerwa - to jak zerwanie. To smutne, że się rozstaliście.

Break

  1. Continue - oznacza, że dzisiaj odpoczniesz, a jutro wszystko uporządkujesz (tzn. pominiesz bieżącą iterację)!

Kontynuuj

 9
Author: BKSpurgeon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-10 11:18:42

Break

Przerwa wymusza natychmiastowe wyjście pętli.

Continue

To jest przeciwieństwo break. Zamiast kończyć pętlę, natychmiast zapętla się ponownie, pomijając resztę kodu.

 7
Author: Sona,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-28 06:58:57

By example

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

Wypisuje 1, 2, 3 (w osobnych wierszach).

Dodaj warunek przerwy na i = 2

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

    Console.WriteLine(i);
}

Teraz pętla drukuje 1 i zatrzymuje się.

Zastąp przerwę ciągiem.

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

    Console.WriteLine(i);
}

Teraz pętla drukuje 1 i 3(pomijając 2).

W ten sposób break zatrzymuje pętlę, podczas gdy continue przeskakuje do następnej iteracji.

 6
Author: Colonel Panic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-07 18:04:54

Ruby niestety jest trochę inny. PS: moja pamięć jest trochę zamglona, więc przepraszam, jeśli się mylę

Zamiast break / continue, ma break / next, które zachowują się tak samo pod względem pętli

Pętle (jak Wszystko inne) są wyrażeniami i "zwracają" ostatnią rzecz, którą zrobili. W większości przypadków uzyskanie wartości zwracanej z pętli jest bezcelowe, więc każdy po prostu robi to

a = 5
while a < 10
    a + 1
end

Możesz jednak to zrobić

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

Jednak dużo kodu ruby "emuluje" pętlę za pomocą bloku. Kanonicznym przykładem jest

10.times do |x|
    puts x
end

Ponieważ ludzie częściej chcą robić rzeczy z wynikiem bloku, tutaj robi się bałagan. break / next oznacza różne rzeczy w kontekście bloku.

Break wyskoczy z kodu, który wywołał blok

Next pominie resztę kodu w bloku i zwróci to, co określisz do wywołującego blok. To nie ma sensu bez przykłady.

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.
Więc tak. Ruby jest niesamowita, ale ma okropne narożniki. Jest to drugi najgorszy, jaki widziałem w moich latach korzystania z niego: -)
 5
Author: Orion Edwards,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-09 02:31:13

Prosta odpowiedź:

Break natychmiast opuszcza pętlę.
Kontynuuj rozpoczyna przetwarzanie następnego elementu. (Jeśli istnieją, przeskakując do linii ewaluacyjnej for / while)

 5
Author: Maltrap,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-22 09:11:16

Proszę pozwolić mi stwierdzić oczywiste: zauważ, że dodanie ani break ani continue, spowoduje wznowienie programu; tzn. złapałem się na pewien błąd, a następnie po zalogowaniu go, chciałem wznowić przetwarzanie, i było więcej zadań kodu pomiędzy następnym wierszem, więc po prostu niech to spaść.

 5
Author: David Hall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-14 11:59:41

Aby całkowicie wyrwać się z pętli foreach, break jest używany;

Aby przejść do następnej iteracji w pętli, używane jest continue ;

Break jest przydatny, jeśli przechodzisz przez kolekcję obiektów (jak wiersze w Datatable) i szukasz konkretnego dopasowania, gdy znajdziesz to dopasowanie, nie ma potrzeby kontynuowania przez pozostałe wiersze, więc chcesz się wyrwać.

Continue jest przydatne, gdy osiągnąłeś to, co trzeba w boku iteracji pętli. Zwykle musisz kontynuować po if.

 3
Author: Gopesh Sharma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-09 12:50:42

Jeśli nie chcesz używać break , po prostu zwiększ wartość I w taki sposób, że spowoduje to, że warunek iteracji będzie false I loop nie uruchomi się przy następnej iteracji.

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
}
 2
Author: Umair Khalid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-03 06:18:55

Jak w innych językach:

'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
 0
Author: dba,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-20 14:25:35