C# 如何在c中从第二个嵌套的foreach循环中断第一个foreach循环#
如何从c#中嵌套的每个循环的第二个循环中先断开每个循环的第一个循环,我想检查第二个循环中每个循环的一些条件,然后尝试断开每个循环的父循环C# 如何在c中从第二个嵌套的foreach循环中断第一个foreach循环#,c#,C#,如何从c#中嵌套的每个循环的第二个循环中先断开每个循环的第一个循环,我想检查第二个循环中每个循环的一些条件,然后尝试断开每个循环的父循环 foreach(//do some stuff) { foreach(//do some stuff) { if(//check some condition) { break;//but want to break first foreach loop
foreach(//do some stuff)
{
foreach(//do some stuff)
{
if(//check some condition)
{
break;//but want to break first foreach loop
}
}
}
快速回答:
foreach(//do some stuff)
{
foreach(//do some stuff)
{
if(//check some condition)
{
goto end; // I'd probably add a comment here
}
}
// *1
}
end:
{} // the rest of your code.
但是,但是
SESE违规行为违反了单进单出原则。通过使用额外的条件,很容易修复:
bool found = false;
for (int i=0; i<foo.Count && !found; ++i)
{
for (int j=0; j<bar.Count; ++j)
{
if (...) { found = true; }
}
// *1
if (!found) { ... }
}
boolfound=false;
对于(inti=0;ibooldobreak=false;
foreach(//做一些事情)
{
foreach(//做一些事情)
{
多布雷克=;
如果(多布雷克)断裂;
}
如果(多布雷克)断裂;
}
您可以通过使用“标志”来实现
bool breakout = false
foreach(//do some stuff)
{
foreach(//do some stuff)
{
if(//check some condition)
{
breakout = true;
break;
}
}
if(breakout)
break;
}
您可以尝试像这样使用return
:
foreach(//do some stuff)
foreach(//do some stuff)
if(//check some condition)
return;
您可以在使用的同时使用。也许这段代码对您有所帮助
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;
}
}
如果您不能返回
,我建议使用Linq,它可以使您的代码可读:
@鲁弗:偶尔,你会让自己使用goto
,尤其是当你不能将return
。@Loofer循环被编译成IL-goto循环和LABEL循环。只是如果你有其他选择,就不要养成习惯。@DmitryBychenko没错。如果你想使用goto-IMHO,使用标志没有什么意义。添加了一些解释关于那件事"程序员浪费大量时间考虑或担心其程序中非关键部分的速度,而在考虑调试和维护时,这些提高效率的尝试实际上会产生强烈的负面影响。我们应该忘记效率低的问题,比如说97%的时间:过早优化是最重要的但我们不应该在这关键的3%上放弃我们的机会。我想,旁观者眼中的“可读性”是可以理解的虽然这可能有助于OP的目的,return
不仅仅是中断循环-它中断了包含循环的函数!公平地说,OP没有提到这些循环是返回它们循环得到的值的函数的一部分。
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;
}
}
Boolean found = false;
foreach(var item1 in source1.TakeWhile(_ => !found)) {
foreach(var item2 in source2.TakeWhile(_ => !found)) {
if (some condition)
{
found = true;
//break; // Not necessary
}
}
}