С# loop - break vs. continue

В цикле С# (не стесняйтесь отвечать на другие языки), какая разница между break и continue как средство оставить структуру цикла и перейти к следующей итерации?

Пример:

foreach (DataRow row in myTable.Rows)
{
    if (someConditionEvalsToTrue)
    {
        break; //what the difference between this and continue ?
        //continue;
    }
}
+745
08 авг. '08 в 21:49
источник поделиться
15 ответов

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.

+1414
08 авг. '08 в 21:51
источник

Связанные вопросы


Похожие вопросы

Очень простой способ понять это - поместить слово "цикл" после каждого из ключевых слов. Термины теперь имеют смысл, если они просто читаются, как обычные фразы.

break цикл - цикл прерывается и останавливается.

Цикл цикла

continue продолжает выполняться со следующей итерацией.

+376
08 авг. '08 в 22:33
источник

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:;
}
+97
19 авг. '08 в 20:21
источник

Раньше я всегда запутывался, должен ли я использовать разрыв или продолжить. Вот что помогает мне запомнить:

Когда использовать перерыв против продолжения?

  1. Перерыв - это как расставание. Это грустно, вы расстаетесь. Цикл завершен.

Break

  1. Продолжить - означает, что вы собираетесь сегодня отдохнуть и все уладить завтра (т.е. пропустить текущую итерацию)!

Continue

+27
05 дек. '17 в 23:07
источник

break полностью остановит цикл foreach, continue перейдет к следующему DataRow.

+25
08 авг. '08 в 21:50
источник

Есть больше, чем несколько человек, которым не нравятся 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.

+19
08 авг. '08 в 22:35
источник

Все дали очень хорошее объяснение. Я все еще отправляю свой ответ, чтобы дать пример, если это может помочь.

// 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

+13
21 дек. '10 в 7:27
источник

Разрыв

Перерыв заставит петлю немедленно выйти.

Продолжить

Это противоречит разрыву. Вместо того, чтобы завершать цикл, он сразу же петли снова, пропуская остальную часть кода.

+7
28 мар. '13 в 6:58
источник

В качестве примера

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 переходит к следующей итерации.

+6
10 окт. '13 в 15:34
источник

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.

Так что да. Рубин потрясающий, но в нем есть ужасные угловые шкафы. Это второй худший из тех, что я видел в свои годы: -)

+5
09 авг. '08 в 2:31
источник

Пожалуйста, позвольте мне изложить очевидное: обратите внимание, что добавление ни перерыва, ни продолжение, возобновит вашу программу; то есть я попал в ловушку за определенную ошибку, а затем после ее регистрации мне захотелось возобновить обработку, и между следующей строкой было еще несколько задач кода, поэтому я просто позволил ей провалиться.

+5
23 мар. '09 в 18:23
источник

Простой ответ:

Разрыв завершает цикл.
Продолжить начинает обработку следующего элемента. (Если они есть, перепрыгнув на оценочную строку для/while)

+5
22 окт. '08 в 9:11
источник

Чтобы полностью вырваться из цикла foreach, используется break;

Чтобы перейти к следующей итерации в цикле, используется продолжить;

Разрыв полезен, если вы зацикливаете коллекцию объектов (например, строки в Datatable), и вы ищете конкретное совпадение, когда найдете это совпадение, нет необходимости продолжать через оставшиеся строки, поэтому вы хотите вырваться.

Продолжить полезно, когда вы выполнили то, что вам нужно, на стороне итерации цикла. У вас обычно продолжить после , если.

+3
09 мар. '13 в 12:50
источник

если вы не хотите использовать 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
}
+2
03 февр. '16 в 6:18
источник

Что касается других языков:

'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
20 февр. '18 в 14:25
источник

Посмотрите другие вопросы по меткам или Задайте вопрос