Цикл C # - перерыв против продолжения

587

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

Пример:

foreach (DataRow row in myTable.Rows)
{
    if (someConditionEvalsToTrue)
    {
        break; //what the difference between this and continue ?
        //continue;
    }
}
  • 2
    сообщение в блоге с кульминацией ниже adamthings.com/post/2012/07/26/…
  • 4
    continue; остановит обработку текущей row и продолжит следующую row из коллекции. С другой стороны, break; оставит оператор foreach полностью, а остальные строки никогда не будут обработаны.
Теги:
loops
enumeration

13 ответов

1242
Лучший ответ

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
    Почему их брекеты продолжаются - я знаю, что это работает без них, но почему?
  • 40
    @GeorgeWillcox Моя младшая, более глупая личность еще не научилась всегда использовать брекеты. (Они являются необязательными в C # для отдельных операторов, но если их не указывать, будет легче ввести ошибку позже. Также см. Programmers.stackexchange.com/a/16530/6342 )
357

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

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

Цикл цикла

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

83

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:;
}
  • 2
    Я заметил, что многие циклы здесь просто используют стандартный цикл for , но будет ли это работать до и после тестирования циклов while ? Обозначение goto заставляет меня верить в это, но нуждается в некоторой проверке.
  • 1
    @Daniel, для циклов WHILE вы можете использовать BREAK и CONTINUE, нет проблем.
Показать ещё 1 комментарий
21

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

17

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

11

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

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

7

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

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

Разрыв

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

Продолжить

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

  • 1
    Продолжить тоже проверяет состояние цикла :)
  • 1
    Continue не является противоположностью break , break останавливает цикл, continue останавливает текущую итерацию.
5

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.

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

4

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

4

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

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

3

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

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

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

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

2

если вы не хотите использовать 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
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню