Вопрос:

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

c# loops enumeration

691928 просмотра

15 ответа

36777 Репутация автора

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

Пример:

foreach (DataRow row in myTable.Rows)
{
    if (someConditionEvalsToTrue)
    {
        break; //what's the difference between this and continue ?
        //continue;
    }
}
Автор: Seibar Источник Размещён: 08.08.2008 09:49

Ответы (15)


25 плюса

4376 Репутация автора

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

Автор: palmsey Размещён: 08.08.2008 09:50

1414 плюса

119572 Репутация автора

Решение

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.

Автор: Michael Stum Размещён: 08.08.2008 09:51

376 плюса

5001 Репутация автора

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

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

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

Автор: JeremiahClark Размещён: 08.08.2008 10:33

19 плюса

15485 Репутация автора

Есть больше чем несколько людей, которые не любят 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необходимости.

Автор: yukondude Размещён: 08.08.2008 10:35

5 плюса

87074 Репутация автора

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 означает разные вещи в контексте блока.

перерыв выпрыгнет из кода, который вызвал блок

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 потрясающий, но у него есть несколько ужасных угловых случаев. Это второй худший из тех, что я видел за годы его использования :-)

Автор: Orion Edwards Размещён: 09.08.2008 02:31

97 плюса

1692 Репутация автора

останов заставляет счетчик программы выпрыгнуть из области самого внутреннего цикла

for(i = 0; i < 10; i++)
{
    if(i == 2)
        break;
}

Работает так

for(i = 0; i < 10; i++)
{
    if(i == 2)
        goto BREAK;
}
BREAK:;

продолжить прыжки до конца цикла. В цикле 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:;
}
Автор: SemiColon Размещён: 19.08.2008 08:21

5 плюса

2041 Репутация автора

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

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

Автор: Maltrap Размещён: 22.10.2008 09:11

5 плюса

0 Репутация автора

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

Автор: cinco Размещён: 23.03.2009 06:23

13 плюса

1045 Репутация автора

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

// 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 [Отпечатано] не будут отображаться, так как при 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] не будет отображаться, так как есть продолжение, когда я == 3

Автор: Pritom Nandy Размещён: 21.12.2010 07:27

3 плюса

4357 Репутация автора

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

Для перехода к следующей итерации цикла используется продолжить ;

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

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

Автор: Gopesh Sharma Размещён: 09.03.2013 12:50

7 плюса

601 Репутация автора

Перерыв

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

Продолжить

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

Автор: Sona Размещён: 28.03.2013 06:58

6 плюса

84386 Репутация автора

Примером

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

Автор: Colonel Panic Размещён: 10.10.2013 03:34

2 плюса

1336 Репутация автора

если вы не хотите использовать break, вы просто увеличиваете значение 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
}
Автор: Umair Khalid Размещён: 03.02.2016 06:18

27 плюса

14357 Репутация автора

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

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

  1. Разбить - это все равно что расстаться. Грустно, вы расстаетесь. Цикл завершен.

Перерыв

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

Продолжить

Автор: BKSpurgeon Размещён: 05.12.2017 11:07

0 плюса

399 Репутация автора

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

'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
Автор: dba Размещён: 20.02.2018 02:25
32x32