如何在C#中一次摆脱多个循环?


71

如果我有嵌套循环,并且想一次脱离所有循环怎么办?

while (true) {
    // ...
    while (shouldCont) {
        // ...
        while (shouldGo) {
            // ...
            if (timeToStop) {
                break; // Break out of everything?
            }
        }
    }
}

在PHP中,break采用一个参数来表示要中断的循环数。可以在C#中完成类似的事情吗?

那可怕的东西怎么样goto

// In the innermost loop
goto BREAK
// ...
BREAK: break; break; break;

1
那是goto的错误语法。只需将标签放在循环之外,不要在任何地方放置任何中断。
Jimmy 2010年



Eric-您的博客对于C#开发人员来说是必不可少的信息。非常感谢您在此处发布的所有信息!!!
鲍勃·丹尼

Answers:


88

将嵌套循环提取到函数中,然后可以使用return从任何地方退出循环,而无需中断。


18
那是一个技巧,而不是功能的用途,大多数讨厌go的人都认为功能的早期回报同样糟糕。我不同意这些笼统的陈述,但是我想说,使用goto与解决问题的方法一样有效,尽管肯定不是那么简单。
马特2010年

23
我完全不同意哑光。人谁相信需要从功能的单一出口的数量是多少谁比那些讨厌的goto小。原因是在许多语言中,goto不会执行正确的资源清除(肯定不了解C#),而return会执行。恕我直言,功能还用于分组,范围界定和简化相关代码。这正是这样做的。
Michael Anderson 2010年

我同意这个答案。将嵌套循环放入单独的函数中的一个原因是原始函数太大了。如果原始函数这么大,则嵌套循环是将函数分解为两个函数的好地方。您拥有任务A,该任务是一系列嵌套循环,然后在循环找到所需的内容后转到任务B。如果您觉得有多重回报是一个问题,则说明您的函数太大了。
罗素·汉金斯

我们在2018年处于C#的
风风雨雨之中

68

引入另一个控制标志,并将其放入所有嵌套的while条件中,如下所示。还要用它替换while(true)条件

bool keepLooping = true;
while (keepLooping) {
    // ...
    while (shouldCont && keepLooping) {
        // ...
        while (shouldGo && keepLooping) {
            // ...
            if (timeToStop) { 
                keepLooping  = false;
                break; // break out of everything?
            }
        }  
    }
}

2
+1非常好!:)我发布了与此类似的内容,但是您的效果更好,因此我将其删除。
Mark Carpenter'2

我希望我可以多次投票。“ if(timeToStop && keepLo​​oping)”可能会失去“ keepLo​​oping”部分,除此之外,还不错!
马克·卡彭特

1
我不明白,这比goto更容易阅读吗?您必须想出一个变量名来描述它打破所有循环的意图,为什么您不花同样的精力为goto标签想出一个名字呢?毕竟这要慢一些。您必须寻找使用keepLo​​oking的所有地方,而不仅仅是一个标签。
马特2010年

编辑以删除最后一个循环上不必要的keepLo​​oping,如@Pwninstein建议
Fadrian Sudaman 2010年

1
@Matt-当然,您可以执行相同的操作,并且个人喜好,我将在GOTO上使用上述方法。在这种情况下,GOTO可能具有可读性,但是在许多情况下,GOTO会使代码非常不可读,因此在结构编程环境中实际上是不可取的。我见过的大多数编码指南都在不断抛弃它,为什么要针对上述简单的结构问题来打破它呢?我唯一使用过GOTO并发现它真正有用的时间是当我编写了一个复杂的解析器时,需要用一些有趣的重复逻辑针对数百个关键字来解释令牌。
Fadrian Sudaman 2010年

28

滥用后,Goto才是可怕的。退出某些嵌套的最内层循环是可以接受的。但是...首先要问为什么那里有这么多的嵌套。

简短答案:不可以。


13
+1。基本上,每个控制结构都goto在下面。只是适合特定目的。对于那些特殊用途涵盖的所有内容,没有其他“优雅”的选择goto
乔伊

1
IMO GOTO仅在外部汇编编程中使用时才是可怕的。不过,对每个人来说:)
马克·卡彭特

从结构化编程的角度来看,goto只是一个低级结构,在其上实现了选择和迭代的高级结构。返回,中断和继续中断结构化的编程模块,实际上只是goto的特例,但我认为它们的用处往往会赢得胜利。
斯图尔特2015年

3

如果要突破整个方法,请使用下面的代码。如果您只想打破一个方法中的一系列循环而又不脱离该方法,那么已经发布的答案之一就可以了。

if (TimeToStop)
{
   return;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.