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

时间:2011-09-08 17:35:32

标签: 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
    }
}

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

if(LoopShouldTerminate)
    break;
PS:或者我很困惑!

[POST] 我得到了消息,问题是Solved,但我想假设在for循环中使用Switch并不是一个神的想法,因为我从很多开发人员那里听到我应该在我获得期望的结果,所以使用switch需要额外的布尔值或将Int i值推到50 direclty,但如果我们使用while循环会发生什么?

8 个答案:

答案 0 :(得分:11)

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

for(int i = 0; i < 50; ++i)
{
    if (DoCheckStatus(i)) break;
}

...

bool DoCheckStatus(int i)
{
    switch(CheckStatus(i))
    {
        case 1 : return true;
        default: return false;
    }
}

解决方案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)

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

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

答案 1 :(得分:6)

您可以使用goto来突破switch中的循环。

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

            }
        }

    :outofloop
        // more code

goto ...

的少数好用之一

答案 2 :(得分:2)

您可以将循环放在方法中并只使用return吗?

示例:

myLoopingMethod()
{
    int n = 0;
    for (int i = 0; i < 50;i++)
    {
        n = checkStatus();
        switch (n)
        {
            case 1:
                return;
        }
    }
}

另一种选择是使用传统的if/else代替switch/case。然后你可以使用break,它会跳出你的for循环

答案 3 :(得分:2)

只需更改i的值:

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

            }
        }

答案 4 :(得分:2)

如果在switch之后没有其他代码,您可以在for循环中检查是否继续循环:

bool doContinue = true;
for (int i = 0; i < 50 && doContinue; i++)
{
    n = checkStatus();
    switch (n)
    {
        case 1:
            doContinue = false;

    }
}

答案 5 :(得分:0)

你可以使用布尔值。

                int n = 0;
            for (int i = 0; i < 50; i++)
            {
                bool shouldBreak = false;
                n = checkStatus();
                switch (n)
                {
                    case 1:
                        shouldBreak = true;
                        break;
                }

                if (shouldBreak)
                    break;
            }

答案 6 :(得分:0)

我不知道在循环结束后是否还需要执行其他逻辑,但您可以尝试使用return。另一种选择是设置一个布尔标志,并在切换后退出。

switch (n)
{
    case 1:
        return;
}

答案 7 :(得分:0)

这种糟糕的设计气味;有几种方法可以解决这个问题:

如果您的开关只有一个条件会破坏外部循环,那么只需在进入开关之前检查一下:

 if(n == 1)
    break;

 switch(n) { }

如果多个条件可以打破循环,则重构为更linq样式的查询:

Enumerable.Range(0, 50).FirstOrDefault(x => listOfBreakCodes.Contains(checkStatus());

这应该调用checkStatus最多50次,直到遇到1(或其他中断代码),然后不再继续评估元素。