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循环会发生什么?
解决方案一:将循环和开关移动到不同的方法:
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(或其他中断代码),然后不继续计算元素。