摆脱多个循环?

26 c# foreach loops goto break

可能重复:
突破嵌套循环

我有这个代码

foreach (___)
{
    foreach (___)
    {
        foreach (___)
        {
            if (condition)
            {
                //break out of all loops
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

break只是"打破"了最内在的循环(对不起我的英语),我想把它们全部留下......

我在考虑:

  1. GOTO,但我总是被告知不要使用它
  2. 一种布尔标志

还有更优雅的方式吗?喜欢由C#提供?

在此先感谢您的帮助!

Rob*_*ani 55

一个非常优雅的解决方案是将整个循环嵌套移动到一个单独的方法,return;当你想要打破所有循环时.

  • 但是,如果从循环中访问一堆局部变量,这可能不起作用. (5认同)
  • -1表示不使用`goto` (5认同)
  • 重构+1以避免高嵌套. (4认同)
  • @TomTom:这是什么原因? (2认同)
  • @RobertRouhani +1来抵消一个似是而非的无法解释的downvote (2认同)

dtb*_*dtb 52

A goto在这里完全没问题:

foreach (___)
{
    foreach (___)
    {
        if (condition)
        {
            goto done;
        }
    }
}
done: ;
Run Code Online (Sandbox Code Playgroud)

  • +1不怕!:) (41认同)
  • 参见[Cargo Cult Programming](http://en.wikipedia.org/wiki/Cargo_cult_programming).我声称peole downvoting这并不真正理解*为什么*`goto`被认为是有害的并且只是避免它,因为他们经常听到'goto is evil` mantra(原则上是**但是只有*in原理*). (17认同)
  • 转到正确! (5认同)
  • @Heinzi,使用'goto`可能会很好,但你最终会浪费很多时间与同事争论.最好将它重构为一个单独的函数. (5认同)
  • 除了重构使用方法之外,我没有看到比`goto`更清晰,更易读的解决方案来解决这个问题. (4认同)
  • -1使用goto (2认同)
  • @avakar:如果你的同事是愚蠢的,教育他们或忽视他们.使用错误的解决方案取悦他们的无知绝对不是*正确的事情. (2认同)

Gle*_*enn 6

最好的方法可能是使用return语句重构较小的方法.但是如果你在范围内需要很多变量,你总是可以使用委托.

   Action work = delegate
        {
            foreach (___)
            {
                 foreach (___)
                 {
                       foreach (___)
                       {
                            if (condition)
                            {
                                 return;
                            }
                       }
                  }
             }

        };

  work();
Run Code Online (Sandbox Code Playgroud)

  • 这是绕过`goto`的一种非常讨厌的方式.:-D需要更多时间才能意识到`return`只退出匿名方法. (9认同)

小智 5

多年前,当我在学校的时候,我们的信息学与书本愚蠢的老师很相似.一条规则是"没有转到".我有一个算法,有多个循环,增长到大小的许多倍,没有goto.

有充分的理由,打破多个循环就是其中之一.