断开内部开关无法终止FOR循环

Bur*_*imi 5 c# syntax switch-statement

我有一个代码片段:

int n = 0;
for (int i = 0; i < 50;i++)
{
    n = checkStatus();
    switch (n)
    {
       case 1:
          break;
          break;//This is unreachable and so i cannot Terminate the For Loop within the SWITCH
    }
}
Run Code Online (Sandbox Code Playgroud)

如注释中所述,我不能直接从Switch终止For循环,只有当我声明一个布尔值并且在Switch的测试结束时

if(LoopShouldTerminate)
    break;
Run Code Online (Sandbox Code Playgroud)

PS:或许我很困惑!

[POST] 我得到的消息,这个问题就解决了,但我想asume,使用中的for循环开关是不是神的想法,因为我是从很多开发者的听说我应该从循环的那一刻,当突破我得到期望的结果,因此,使用开关需要的额外的布尔或推诠释i值50照片直接,但是如果我们使用while循环会发生什么?

Eri*_*ert 11

解决方案1:将循环和开关移动到不同的方法:

for(int i = 0; i < 50; ++i)
{
    if (DoCheckStatus(i)) break;
}
Run Code Online (Sandbox Code Playgroud)

...

bool DoCheckStatus(int i)
{
    switch(CheckStatus(i))
    {
        case 1 : return true;
        default: return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

解决方案2:使用热切的扩展方法调整上述内容以消除循环:

static void DoWhile<T>(this IEnumerable<T> sequence, Func<T, bool> predicate)
{
    foreach(T item in sequence) 
        if (!predicate(item)) return;
}

...

Enumerable.Range(0, 50).DoWhile(DoCheckStatus)
Run Code Online (Sandbox Code Playgroud)

解决方案3:调整上述内容以消除循环和辅助方法:

Enumerable.Range(0, 50).DoWhile(i=> 
{ 
    switch(CheckStatus(i))
    {
        case 1 : return true;
        default: return false;
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 只记得`TakeWhile`是懒惰的 (2认同)

Ode*_*ded 6

你可以使用goto,以打破在循环内switch.

        int n = 0;
        for (int i = 0; i < 50;i++)
        {
            n = checkStatus();
            switch (n)
            {
                case 1:
                    goto outofloop;

            }
        }

    :outofloop
        // more code
Run Code Online (Sandbox Code Playgroud)

goto...... 的少数好用之一

  • @Chad:"break"本身只是一个"goto",它甚至不是一个goto,你礼貌地标记它的目标!我同意结构代码可能比嵌套在循环中的开关更优雅,但在这种特殊情况下,我没有任何问题,剥去了伪造"破坏"与"goto"相同的薄单板. (7认同)
  • @Chad - 小心解释为什么`goto`的本地化使用是_sooooo_不好? (4认同)
  • @Chad - "GOTO认为有害"是GOTO在特定语言中滥用的遗留物.像任何其他编程结构一样,它有它的位置. (4认同)
  • @Oded它马虎.我还没有看到一个简单的重新分解不能消除使用`goto`的倾向的情况.例如,将循环提取到方法并使用`return`将消除对此特定`goto`的需要. (2认同)