C# 循环 - 中断与继续

Posted

技术标签:

【中文标题】C# 循环 - 中断与继续【英文标题】:C# loop - break vs. continue 【发布时间】:2010-09-05 14:31:59 【问题描述】:

在C#(其他语言可以随意回答)循环中,breakcontinue 作为离开循环结构并进入下一个迭代的手段有什么区别?

例子:

foreach (DataRow row in myTable.Rows)

    if (someConditionEvalsToTrue)
    
        break; //what's the difference between this and continue ?
        //continue;
    

【问题讨论】:

博客文章的高潮在下面adamthings.com/post/2012/07/26/… continue; 将停止处理当前的row 并继续处理集合中的下一个 row。另一方面,break; 将完全离开foreach 语句,并且永远不会处理剩余的行。 C# go to next item in list based on if statement in foreach的可能重复 【参考方案1】:

break 将完全停止 foreach 循环,continue 将跳到下一个 DataRow

【讨论】:

【参考方案2】:

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,但循环会继续并且DoSomeThingWith 将为i = 1i = 9 执行。

【讨论】:

为什么他们周围没有大括号 continue - 我知道没有他们也可以,但是为什么呢? @GeorgeWillcox 我更年轻、更愚蠢的自己始终没有学会使用牙套的价值。 (它们在 C# 中对于单个语句是可选的,但不放置它们会使以后更容易引入错误。另请参阅 programmers.stackexchange.com/a/16530/6342)【参考方案3】:

理解这一点的一个非常简单的方法是在每个关键字之后放置“循环”一词。如果这些术语只是像日常用语一样阅读,那么它们现在是有意义的。

break 循环 - 循环中断并停止。

continue 循环 - 循环继续执行下一次迭代。

【讨论】:

【参考方案4】:

不喜欢breakcontinue的人不少。我看到的关于它们的最新投诉是在 Douglas Crockford 的 javascript: The Good Parts 中。但我发现有时使用其中一个确实可以简化事情,特别是如果您的语言不包含 do-whiledo-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

【讨论】:

【参考方案5】:

不幸的是,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会跳出调用block的代码

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 很棒,但它有一些可怕的极端情况。这是我多年来使用它时见过的第二个最差的 :-)

【讨论】:

【参考方案6】:

break使程序计数器跳出最内层循环的范围

for(i = 0; i < 10; i++)

    if(i == 2)
        break;

像这样工作

for(i = 0; i < 10; i++)

    if(i == 2)
        goto BREAK;

BREAK:;

continue 跳转到循环的末尾。在 for 循环中, continue 跳转到增量表达式。

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:;

【讨论】:

我注意到这里的许多循环只使用标准的for 循环,但这适用于预测试和后期测试的while 循环吗? goto 符号让我相信,但需要一些验证。 @Daniel,对于 WHILE 循环,您可以使用 BREAK 和 CONTINUE,没问题。 @DanielPark 对于while(“预测试”)和do-while(“后测试”),在满足continue; 语句之后,接下来的事情是将发生的是评估循环条件以决定是否要进行额外的迭代。当然,break; 循环条件是 not 检查的,循环完全退出。所以goto 类比也有助于理解这一方面。【参考方案7】:

简单回答:

Break 立即退出循环。Continue 开始处理下一项。 (如果有的话,跳到for/while的求值行)

【讨论】:

【参考方案8】:

请让我说清楚:请注意,既不添加中断也不添加继续,将恢复您的程序;即我陷入了某个错误,然后在记录它之后,我想恢复处理,并且下一行之间还有更多的代码任务,所以我就让它失败了。

【讨论】:

【参考方案9】:

大家都给出了很好的解释。我仍然发布我的答案只是为了举例说明是否有帮助。

// 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[Printed] & 4[Printed] 不会显示,因为 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] 不会显示,因为 i == 3 时有 continue

【讨论】:

【参考方案10】:

要完全跳出foreach循环,使用break

要进入循环中的下一个迭代,使用 continue

Break 如果您正在循环遍历对象集合(如数据表中的行)并且正在搜索特定匹配项,则当您找到该匹配项时,无需继续通过剩余的行,所以你想突破。

Continue 当您在循环迭代中完成了您需要做的事情时很有用。在 if 之后,您通常会有 continue

【讨论】:

【参考方案11】:

休息

Break 强制循环立即退出。

继续

这与break相反。它不会终止循环,而是立即再次循环,跳过其余代码。

【讨论】:

继续检查循环条件:) Continuebreak 不相反,break 停止循环,continue 停止当前迭代。【参考方案12】:

举例

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 跳到下一次迭代。

【讨论】:

【参考方案13】:

如果您不想使用 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

【讨论】:

虽然这可行,但它不是一个好方法。关键字break 表示您的意图。如果我看到了,我会想知道发生了什么事……我需要多打几下才能弄清楚为什么有人这样做。 break 就是为此目的而存在的,为了避免使用关键字而做一些更令人困惑的事情是愚蠢的。【参考方案14】:

何时使用 break 与 continue?

    分手 - 就像分手一样。很遗憾,你们要分开了。循环已退出。

    继续 - 表示您今天要休息一下,明天再整理(即跳过当前迭代)!

(老生常谈的故事¯_(ツ)_/¯ 但有助于我记住 - 希望你也是!)

【讨论】:

将与我的伙伴分享。可能 Continue 应该重命名为 GetOverIt,而 Break 应该重命名为 MoveOnForward。难怪我们被称为极客,Break 有什么意义?听起来很具有破坏性。需要添加的是 - STOP,甚至更好的 EndIt - 将修复许多错误,并使 C-sharp 真正清晰。 再次进入洪水 又是一次又一次的旅行 所以我犯了一个大错误 试着看看它一次我的方式 @TalalZahid 我不明白?【参考方案15】:

至于其他语言:

'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

【讨论】:

【参考方案16】:

由于此处编写的示例对于理解概念非常简单,我认为查看正在使用的 continue 语句 的更实用版本 也是一个好主意。 例如:

我们要求用户输入 5 个唯一的数字,如果该数字已经输入,我们会给他们一个错误并继续我们的程序。

static void Main(string[] args)
        
            var numbers = new List<int>();


            while (numbers.Count < 5)
             
            
                Console.WriteLine("Enter 5 uniqe numbers:");
                var number = Convert.ToInt32(Console.ReadLine());



                if (numbers.Contains(number))
                
                    Console.WriteLine("You have already entered" + number);
                    continue;
                



                numbers.Add(number);
            


            numbers.Sort();


            foreach(var number in numbers)
            
                Console.WriteLine(number);
            


        

假设用户输入的是 1,2,2,2,3,4,5。打印的结果是:

1,2,3,4,5

为什么?因为每次用户输入一个已经在列表中的数字时,我们的程序都会忽略它并且不会将列表中已经存在的内容添加到其中。 现在,如果我们尝试相同的代码,但没有 continue 语句,假设用户的输入相同,即 1,2,2,2,3,4,5。 输出将是:

1,2,2,2,3,4

为什么?因为没有 continue 语句让我们的程序知道它应该忽略已经输入的数字。

现在对于中断声明,我再次认为它最好通过示例来展示。例如:

在这里,我们希望我们的程序不断要求用户输入一个数字。我们希望循环在用户输入“ok”时终止,并在最后计算所有先前输入的数字的总和并将其显示在控制台上。

这就是 break 语句 在本示例中的使用方式:


            var sum = 0;
            while (true)
            
                Console.Write("Enter a number (or 'ok' to exit): ");
                var input = Console.ReadLine();

                if (input.ToLower() == "ok")
                    break;

                sum += Convert.ToInt32(input);
            
            Console.WriteLine("Sum of all numbers is: " + sum);
        

程序会要求用户输入一个数字,直到用户输入“OK”,然后才会显示结果。为什么? 因为 break 语句在达到所需条件时完成或停止正在进行的进程。

如果那里没有 break 语句,程序将继续运行,当用户键入“ok”时不会发生任何事情。

我建议复制此代码并尝试删除或添加这些语句并自己查看更改。

【讨论】:

以上是关于C# 循环 - 中断与继续的主要内容,如果未能解决你的问题,请参考以下文章

中断内部 foreach 循环并继续外部 foreach 循环

Ractive.js 继续和中断循环

Java 循环 - 中断?继续?

Java 中的分支和循环(中断和继续)

在 Kotlin 中的功能循环中,如何“中断”或“继续”?

标记和未标记的中断,在 C# 或 C++ 中继续 [关闭]