C#循环 – rest与继续
在C#中(随意回答其他语言)循环,break和continue之间的差别是什么,作为离开循环结构的一种手段,并转到下一次迭代?
例:
foreach (DataRow row in myTable.Rows) { if (someConditionEvalsToTrue) { break; //what's the difference between this and continue ? //continue; } }
break
将完全退出循环, continue
跳过当前的迭代。
例如:
for (int i = 0; i < 10; i++) { if (i == 0) { break; } DoSomeThingWith(i); }
break会导致循环在第一次迭代时退出 – DoSomeThingWith
永远不会被执行。 这里:
for (int i = 0; i < 10; i++) { if(i == 0) { continue; } DoSomeThingWith(i); }
对于i = 0
,不会执行DoSomeThingWith
,但是循环将继续,并且对于i = 1
到i = 9
, DoSomeThingWith
将被执行。
理解这个的一个非常简单的方法是在每个关键字之后放置“loop”这个词。 现在的条款是有道理的,如果他们只是像日常短语一样阅读。
break
循环 – 循环被打破并停止。
continue
循环 – 循环继续执行下一个迭代。
break导致程序计数器跳出最内层循环的范围
for(i = 0; i < 10; i++) { if(i == 2) break; }
像这样工作
for(i = 0; i < 10; i++) { if(i == 2) goto BREAK; } BREAK:;
继续跳转到循环的结尾。 在for循环中,继续跳转到增量expression式。
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
。
有不less人不喜欢break
和continue
。 我看到的最新投诉是JavaScript: Douglas Crockford 的Good Part 。 但是我发现有时使用其中的一种可以简化事情,特别是如果你的语言不包含do-while
或do-until
循环风格的话。
我倾向于在正在search列表的循环中使用break
。 一旦find了,继续下去就没有意义了,所以你最好不要离开。
当使用列表中的大多数元素continue
时,我会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
循环是针对特定问题的更优雅的解决scheme:
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 [印刷] 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有继续
举例来说
foreach(var i in Enumerable.Range(1,3)) { Console.WriteLine(i); }
打印1,2,3(单独行)。
在i = 2处添加rest条件
foreach(var i in Enumerable.Range(1,3)) { if (i == 2) break; Console.WriteLine(i); }
现在循环打印1并停止。
用继续replace中断。
foreach(var i in Enumerable.Range(1,3)) { if (i == 2) continue; Console.WriteLine(i); }
现在循环打印1和3(跳过2)。
因此, break
停止循环,而continue
跳到下一个迭代。
打破
中断迫使一个循环立即退出。
继续
这是相反的rest。 它不会终止循环,而是立即循环,跳过其余的代码。
不幸的是,Ruby有些不同。 PS:我的记忆有点朦胧,所以如果我错了,我很抱歉
而不是打破/继续,它有break / next,在循环方面performance相同
循环(就像其他的一样)是expression式,并且“返回”他们所做的最后一件事情。 大多数情况下,从循环获取返回值是毫无意义的,所以每个人都这样做
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会跳出调用该块的代码
接下来将跳过块中的其余代码,并将指定的内容“返回”给块的调用者。 没有例子,这没有任何意义。
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很棒,但它有一些糟糕的angular落案例。 这是我使用它的第二个最糟糕的:-)
简单的回答:
Break立即退出循环。
继续开始处理下一个项目。 (如果有的话,跳转到for / while的评估线)
请让我说明一点:请注意,既不添加中断也不会继续,将恢复您的程序; 即我被困在一个特定的错误,然后logging它,我想恢复处理,并在下一行之间有更多的代码任务,所以我只是让它通过。
彻底打破foreach循环,使用break ;
要进入循环的下一个迭代, 继续使用;
如果你在对象集合中进行循环(比如数据表中的行),并且你正在search一个特定的匹配,当你find匹配时,不需要继续通过其余的行,所以你想中断出。
如果在循环迭代中完成了所需的工作, 继续就很有用。 你通常会在if后继续 。
如果你不想使用break ,只需增加I的值,使得迭代条件为false,循环将不会在下一次迭代中执行。
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 }