С петлей# - перерыв и продолжить



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



пример:



foreach (DataRow row in myTable.Rows)
{
if (someConditionEvalsToTrue)
{
break; //what's the difference between this and continue ?
//continue;
}
}
585   15  

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.

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

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 продолжите переход к выражению инкремента.

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 когда вы делаете что-то с большинством элементов списка, но все же хотите пропустить несколько.

The break заявление также пригодится при опросе для действительного ответа от кого-то или чего-то. Вместо:

Ask a question
While the answer is invalid:
    Ask the question

вы можете устранить некоторые дублирования и использовать:

While True:
    Ask a question
    If the answer is valid:
        break

The 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[Printed] 1[Printed] 2 [Printed]

Так что 3 [Printed] & 4[Printed] не будет отображаться, как есть перерыв, когда я == 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[Printed] 1[Printed] 2[Printed] 4 [Printed]

So 3[Printed] не будет отображаться, как есть продолжить, когда i = = 3

Я всегда путаюсь, следует ли мне использовать break или продолжить. Вот что помогает мне вспомнить:

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

  1. перерыв - это как расстаться. Это печально, вы, ребята, расстаемся.

Break

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

Continue

перерыв

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

дальше

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

пример

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

Рубин, к сожалению, немного отличается. 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 выскочит из кода, который вызвал блок

далее будет пропущена остальная часть кода в блоке, и 'return' то, что вы укажете на звонящий из блока. Это не имеет никакого смысла без примеров.

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.

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

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

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

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

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

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

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

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

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

Comments

    Ничего не найдено.