我得到了財產以後像(簡化)
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摩根 - 格雷厄姆:不知道這事,給看看吧! –