我有点像(简化)
foreach (...)
{
foreach (...)
{
//Some code
if (statement)
{
break;
}
}
}
问题在于我希望我的声明可以留给双foreach循环! 我正在考虑将某种“破坏标志”作为布尔值,但是有什么方法可以避免这种情况吗?
答案 0 :(得分:10)
您可以使用goto。
答案 1 :(得分:7)
你可以尝试:
bool leave = false;
foreach (...)
{
foreach (...)
{
//Some code
if (statement)
{
leave = true;
break;
}
}
if (leave) break;
}
编辑:移动了休息标志
答案 2 :(得分:7)
您可以使用Linq和SelectMany
完全避免嵌套循环。
而不是:
foreach(var value in someValues)
{
foreach(var subValue in value.SubValues)
{
// ...
break;
}
}
您的代码将变为:
foreach(var subValue in someValues.SelectMany(v => v.SubValues))
{
// ...
break;
}
如果您需要一些逻辑来选择是否循环SubValues
,请将该逻辑抛出一个额外的Where
子句。
而不是
foreach(var value in someValues)
{
if(value.IsMumsHairGreenToday)
{
foreach(var subValue in value.SubValues)
{
// ...
break;
}
}
}
你可以写:
var subValues = someValues
.Where(v => v.IsMumsHairGreenToday)
.SelectMany(v => v.SubValues)
;
foreach(var subValue in subValues)
{
// ...
break;
}
答案 3 :(得分:5)
当然,您应该查看goto。
答案 4 :(得分:2)
由于break
只会突破当前循环,因此您必须在外循环中测试中断条件 - 除非您使用goto
语句。
变量似乎是最好的方法。
答案 5 :(得分:2)
Imo少数情况之一,小心goto很好。
答案 6 :(得分:1)
您可以将该逻辑封装在方法中并在断点处返回:
private SomeType CheckIfConditionOfNestedItems(IEnumerable enumerable)
{
foreach (var thing in enumerable )
{
foreach (...)
{
//Some code
if (statement)
{
return result;
}
}
}
}
显然这可能需要你稍微更改一下你的代码,但这也有一个好处,就是它可能会让你拥有双循环的代码更具可读性。