Break inside开关不能终止FOR循环

本文关键字:FOR 循环 终止 不能 inside 开关 Break | 更新日期: 2023-09-27 18:08:06

我有一个代码片段:

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:也许我很困惑!

[文章]我得到了消息,问题得到了解决,但我想假设在for循环中使用Switch不是一个好主意,因为我从很多开发人员那里听说,当我得到想要的结果时,我应该从循环中中断,所以使用Switch需要额外的布尔值或直接将Int I值推到50,但是如果我们使用while循环会发生什么?

Break inside开关不能终止FOR循环

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

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:调整上述代码以消除循环和helper方法:

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

您可以使用goto,以便在switch中跳出循环。

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

goto为数不多的好用途之一…

直接改变i:

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

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

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

你能把循环放在一个方法里面,只使用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循环

可以使用布尔值

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

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

switch (n)
{
    case 1:
        return;
}

这是糟糕的设计;有两种方法可以解决这个问题:

如果你的开关只有一个条件会打破外循环,那么在进入开关之前简单地检查一下:

 if(n == 1)
    break;
 switch(n) { }

如果多个条件可以打破循环,重构成一个更linq风格的查询:

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

应该调用checkStatus多达50次,直到遇到1(或其他中断代码),然后不继续计算元素。