С# loop - break vs. continue
В цикле С# (не стесняйтесь отвечать на другие языки), какая разница между break и continue как средство оставить структуру цикла и перейти к следующей итерации?
Пример:
foreach (DataRow row in myTable.Rows)
{
if (someConditionEvalsToTrue)
{
break; //what the difference between this and continue ?
//continue;
}
}
Ответы
Ответ 1
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
Очень простой способ понять это - поместить слово "цикл" после каждого из ключевых слов. Термины теперь имеют смысл, если они просто читаются, как обычные фразы.
break
цикл - цикл прерывается и останавливается.
Цикл цикла continue
продолжает выполняться со следующей итерацией.
Ответ 3
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 продолжить переход к выражению приращения.
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:;
}
Ответ 4
Раньше я всегда запутывался, должен ли я использовать разрыв или продолжить. Вот что помогает мне запомнить:
Когда использовать перерыв против продолжения?
- Перерыв - это как расставание. Это грустно, вы расстаетесь. Цикл завершен.
![Break]()
- Продолжить - означает, что вы собираетесь сегодня отдохнуть и все уладить завтра (т.е. пропустить текущую итерацию)!
![Continue]()
Ответ 5
break
полностью остановит цикл foreach
, continue
перейдет к следующему DataRow
.
Ответ 6
Есть больше, чем несколько человек, которым не нравятся break
и continue
. Последняя жалоба, которую я видел о них, была в JavaScript: "Хорошие детали" Дугласа Крокфорда. Но я считаю, что иногда использование одного из них действительно упрощает, особенно если ваш язык не включает стиль цикла do-while
или 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
.
Ответ 7
Все дали очень хорошее объяснение. Я все еще отправляю свой ответ, чтобы дать пример, если это может помочь.
// 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 [Отпечатано] и 4 [Отпечатано] не будут отображаться, так как есть разрыв, когда я == 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 [Отпечатано] не будет отображаться, так как продолжается, когда я == 3
Ответ 8
Разрыв
Перерыв заставит петлю немедленно выйти.
Продолжить
Это противоречит разрыву. Вместо того, чтобы завершать цикл, он сразу же петли снова, пропуская остальную часть кода.
Ответ 9
В качестве примера
foreach(var i in Enumerable.Range(1,3))
{
Console.WriteLine(i);
}
Печать 1, 2, 3 (в отдельных строках).
Добавить условие перерыва при я = 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
переходит к следующей итерации.
Ответ 10
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
ОДНАКО, много кода ruby "эмулирует" цикл, используя блок.
Канонический пример
10.times do |x|
puts x
end
Так как людям гораздо чаще приходится делать что-то с результатом блока, то здесь он становится беспорядочным.
break/next означает разные вещи в контексте блока.
break выпрыгнет из кода, который называется блоком
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 "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.
Так что да. Рубин потрясающий, но в нем есть ужасные угловые шкафы. Это второй худший из тех, что я видел в свои годы: -)
Ответ 11
Простой ответ:
Разрыв завершает цикл.
Продолжить начинает обработку следующего элемента. (Если они есть, перепрыгнув на оценочную строку для/while)
Ответ 12
Пожалуйста, позвольте мне изложить очевидное: обратите внимание, что добавление ни перерыва, ни продолжение, возобновит вашу программу; то есть я попал в ловушку за определенную ошибку, а затем после ее регистрации мне захотелось возобновить обработку, и между следующей строкой было еще несколько задач кода, поэтому я просто позволил ей провалиться.
Ответ 13
Чтобы полностью вырваться из цикла foreach, используется break;
Чтобы перейти к следующей итерации в цикле, используется продолжить;
Разрыв полезен, если вы зацикливаете коллекцию объектов (например, строки в Datatable), и вы ищете конкретное совпадение, когда найдете это совпадение, нет необходимости продолжать через оставшиеся строки, поэтому вы хотите вырваться.
Продолжить полезно, когда вы выполнили то, что вам нужно, на стороне итерации цикла. У вас обычно продолжить после , если.
Ответ 14
если вы не хотите использовать break, вы просто увеличиваете значение я таким образом, чтобы оно делало условие итерации ложным и цикл не выполнялся на следующей итерации.
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
}
Ответ 15
Что касается других языков:
'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