我得到了财产以后像(简化)
foreach (...)
{
foreach (...)
{
//Some code
if (statement)
{
break;
}
}
}
的事情是,我希望我的发言要离开双的foreach循环! 我正在考虑一种布尔型的“break flag”,但有什么办法可以避免这种情况?
我得到了财产以后像(简化)
foreach (...)
{
foreach (...)
{
//Some code
if (statement)
{
break;
}
}
}
的事情是,我希望我的发言要离开双的foreach循环! 我正在考虑一种布尔型的“break flag”,但有什么办法可以避免这种情况?
你可以使用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;
}
我没有与lambda表达式confortable所以没有想到这样做,听起来不错,因为我避免了breakflag和使用GOTO! –
@GuillaumeCogranne:除非您始终使用它们,否则您永远都不会感到舒服。顺便说一句:请不要使用'goto'。我不在乎人群说什么。这只是有罪的:) –
你可以封装了逻辑的方法,并在破发点返回:
private SomeType CheckIfConditionOfNestedItems(IEnumerable enumerable)
{
foreach (var thing in enumerable)
{
foreach (...)
{
//Some code
if (statement)
{
return result;
}
}
}
}
显然,这可能需要你改变你的代码一点点,但是这也有个好处,它可能使代码你有双循环更可读。
不适合我的代码-_- –
你可以尝试:
bool leave = false;
foreach (...)
{
foreach (...)
{
//Some code
if (statement)
{
leave = true;
break;
}
}
if (leave) break;
}
编辑:移动的破旗
是的,这就是我所说的“breakflag”,但不喜欢它-_- –
@GuillaumeCogranne:ops,我没有读到它... – Marco
当然,你应该检查goto。
任何downvoter请详细说明你为什么这样做? – DanielB
谁和为什么downvote?仅仅因为它的共同“逻辑”转到了邪恶?没有!不是!它仍然是语言的原因,有时候,虽然我很少见,但它是有用的。 – dowhilefor
不同意-2这里 - 他有一个有效的点:) –
由于break
只有在当前循环中出现,所以您将不得不在外循环中测试中断条件 - 除非使用goto
语句。
的变量似乎这样做的最佳方式。
的少数情况下,仔细goto是罚款伊莫之一。
您可以通过使用'Linq'和避免它'SelectMany',使这个单一for-each循环,而不是一个嵌套循环。 –
“破旗”或GOTO – relaxxx
@Merlyn摩根 - 格雷厄姆:不知道这事,给看看吧! –