Цикл C # - разрыв против продолжения - PullRequest
742 голосов
/ 09 августа 2008

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

Пример:

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

Ответы [ 15 ]

5 голосов
/ 22 октября 2008

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

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

5 голосов
/ 09 августа 2008

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

3 голосов
/ 09 марта 2013

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

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

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

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

2 голосов
/ 03 февраля 2016

если вы не хотите использовать 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
}
0 голосов
/ 20 февраля 2018

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

'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
...