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;
}
}
15 answers
break
continue
po 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
.
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ą.
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:;
}
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
.
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
.
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
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?
- Przerwa - to jak zerwanie. To smutne, że się rozstaliście.
- Continue - oznacza, że dzisiaj odpoczniesz, a jutro wszystko uporządkujesz (tzn. pominiesz bieżącą iterację)!
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.
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.
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: -)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)
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ść.
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.
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
}
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
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