我有一个代码段:
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循环会发生什么?
答案 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(或其他中断代码),然后不再继续评估元素。