如何打破嵌套的foreach循环,然后转到c#上的父foreach循环
本文关键字:循环 foreach 何打破 嵌套 然后 | 更新日期: 2023-09-27 18:22:00
我有以下代码:
foreach(// Some condition here)
{
while (// Some condition here)
{
foreach (// Some condition here)
{
if (// Condition again)
{
//Do some code
}
if (// Condition again)
{
//Stop the first foreach then go back to first foreach
}
}
}
}
当我在最后一个foreach
循环中命中第二个if
语句时,我想做的是在第一个foreach
循环中返回。
注意:如果第二个if
语句不为真,它应该继续最后一个foreach
循环,直到条件不为真。
提前感谢!
直接实现这一点的唯一方法是使用goto
。
另一个(更好的)选择是重组,直到问题消失。例如,将内部代码(while+foreach)放入方法中,然后使用return返回。
类似这样的东西:
resetLoop = false;
for(// Some condition here)
{
while (// Some condition here)
{
foreach (// Some condition here)
{
if (// Condition again)
{
//Do some code
}
if (// Condition again)
{
//Stop the first foreach then go back to first foreach
resetLoop = true;
break;
}
}
if (resetLoop) break;
}
if (resetLoop) {
// Reset for loop to beginning
// For example i = 0;
}
}
Noone已经提到了它(Henk简要提到过),但最好的方法是将循环移动到自己的方法中,并使用return
public ReturnType Loop(args)
{
foreach outerloop
foreach innerLoop
if(Condition)
return;
}
正如我所看到的,你接受了这个人提到你的goto语句的答案,在现代编程中,在专家看来,goto是一个杀手,我们称之为编程中的杀手,这有一些特定的原因,我现在不在这里讨论,但你的问题的解决方案很简单,你可以在这种场景中使用布尔标志,就像我将在我的例子中演示的那样:
foreach(// Some condition here)
{
//solution
bool breakme = false;
while (// Some condition here)
{
foreach (// Some condition here)
{
if (// Condition again)
{
//Do some code
}
if (// Condition again)
{
//Stop the first foreach then go back to first foreach
breakme = true;
break;
}
}
}
if(breakme)
{
break;
}
}
简单明了。:)
如前所述,我还建议重新考虑代码,看看是否绝对有必要将3个循环嵌套在另一个循环中。如果是这样,并且我认为其中涉及一些逻辑,您应该考虑拆分为子功能(如建议)
对于一个简单的代码解决方案:
foreach(// Some condition here)
{
var broke = false;
while (// Some condition here)
{
foreach (// Some condition here)
{
if (// Condition again)
{
//Do some code
}
if (// Condition again)
{
//Stop the first foreach then go back to first foreach
broke = true;
break;
}
}
if (broke) break;
// continue your while loop
}
}
var broken = false;
foreach(// Some condition here)
{
broken = false;
while (!broken && // Some condition here)
{
foreach (// Some condition here)
{
if (// Condition again)
{
//Do some code
}
if (// Condition again)
{
//Stop the first foreach then go back to first foreach
broken = true;
break;
}
}
}
}