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 = 1i = 9DoSomeThingWith将被执行。

理解这个的一个非常简单的方法是在每个关键字之后放置“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人不喜欢breakcontinue 。 我看到的最新投诉是JavaScript: Douglas Crockford 的Good Part 。 但是我发现有时使用其中的一种可以简化事情,特别是如果你的语言不包含do-whiledo-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 }