Цикл C# — разрыв vs.продолжать
-
08-06-2019 - |
Вопрос
В цикле C# (не стесняйтесь отвечать на вопросы о других языках) в чем разница между прерыванием и продолжением как средством выхода из структуры цикла и перехода к следующей итерации?
Пример:
foreach (DataRow row in myTable.Rows)
{
if (someConditionEvalsToTrue)
{
break; //what's the difference between this and continue ?
//continue;
}
}
Решение
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
.
Другие советы
Самый простой способ понять это — поместить слово «цикл» после каждого ключевого слова.Термины теперь имеют смысл, если их просто читать как повседневные фразы.
break
цикл - цикл прерывается и останавливается.
continue
цикл — цикл продолжает выполняться на следующей итерации.
перерыв заставляет счетчик программы выходить за пределы самого внутреннего цикла
for(i = 0; i < 10; i++)
{
if(i == 2)
break;
}
Работает вот так
for(i = 0; i < 10; i++)
{
if(i == 2)
goto BREAK;
}
BREAK:;
продолжать переходит в конец цикла.В цикле 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:;
}
break
остановил бы foreach
зациклиться полностью, continue
перешел бы к следующему DataRow
.
Раньше я всегда запутался, следует ли мне использовать перерыв или продолжить.Вот что помогает мне запомнить:
Когда использовать перерыв или продолжить?
- Перерыв - это как расставание.Ребята, это грустно, вы расстаетесь.
- Продолжать - означает, что ты собираешься дать сегодня отдохнуть и разобраться во всем завтра (т.пропустить текущую итерацию)!
Есть немало людей, которым не нравится 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
тоже нужно.
Все дали очень хорошие объяснения.Я все еще публикую свой ответ, просто чтобы привести пример, если это может помочь.
// 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[Printed] не будет отображаться, поскольку продолжение продолжается, когда i == 3.
Перерыв
Break заставляет цикл немедленно завершиться.
Продолжать
Это делает противоположность разрыву.Вместо завершения цикла он немедленно зацикливается снова, пропуская остальную часть кода.
На примере
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
переходит к следующей итерации.
Ruby, к сожалению, немного другой.ПС:Моя память немного туманна на этот счет, так что извините, если я ошибаюсь
вместо прерывания/продолжения у него есть прерывание/следующий, которые ведут себя одинаково с точки зрения циклов
Циклы (как и все остальное) являются выражениями и «возвращают» последнее, что они сделали.В большинстве случаев получение возвращаемого значения из цикла бессмысленно, поэтому все просто делают это.
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 пропустит остальную часть кода в блоке и «вернет» то, что вы укажете, вызывающей стороне блока.Без примеров это не имеет никакого смысла.
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 великолепен, но у него есть ужасные недостатки.Это второй худший вариант, который я видел за годы использования :-)
Простой ответ:
Перерыв немедленно выходит из цикла.
Продолжать начинает обработку следующего элемента.(Если таковые имеются, перейдя к строке оценки for/ while)
Позвольте мне констатировать очевидное:обратите внимание, что если не добавить ни перерыва, ни продолжения, ваша программа возобновится;то естьЯ поймал определенную ошибку, затем, после ее регистрации, мне захотелось возобновить обработку, а между следующей строкой было еще несколько задач кода, поэтому я просто позволил ей провалиться.
Чтобы полностью выйти из цикла foreach, перерыв используется;
Чтобы перейти к следующей итерации цикла, продолжать используется;
Перерыв полезно, если вы просматриваете коллекцию объектов (например, строки в таблице данных) и ищете конкретное совпадение, когда вы найдете это совпадение, нет необходимости продолжать просмотр оставшихся строк, поэтому вы хотите вырваться .
Продолжать полезен, когда вы выполнили то, что вам нужно, во время итерации цикла.Обычно у вас будет продолжать после если.
если ты не хочешь использовать перерыв вы просто увеличиваете значение 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
}
Что касается других языков:
'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