有沒有辦法在一個語句中執行以下操作?帶條件的foreach循環
foreach(CheckBox subset in groupBox_subset.Controls)
if(subset.Checked) { ... }
有沒有辦法在一個語句中執行以下操作?帶條件的foreach循環
foreach(CheckBox subset in groupBox_subset.Controls)
if(subset.Checked) { ... }
肯定的:
foreach (CheckBox subset in groupBox_subset.Controls
.Cast<CheckBox>()
.Where(c => c.Checked))
{
...
}
是必需的Cast
電話,因爲Controls
屬性只實現IEnumerable
,不IEnumerable<T>
,但基本上LINQ工作在強類型集合。換句話說,現有的代碼是實際上接近:
foreach(Object tmp in groupBox_subset.Controls)
{
CheckBox subset = (CheckBox) tmp;
if(subset.Checked) { ... }
}
如果你希望能夠忽視非CheckBox
控制,你想OfType
方法,而不是Cast
在上面的代碼片段:
foreach (CheckBox subset in groupBox_subset.Controls
.OfType<CheckBox>()
.Where(c => c.Checked))
{
...
}
是的,有:
foreach(CheckBox subset in groupBox_subset.Controls.Cast<CheckBox>()
.Where(x => x.Checked))
然而,這僅在Controls
所有項目CheckBox
類型的作品。如果Controls
中至少有一個項目不是CheckBox
,則會引發異常。但你的代碼也是如此。
所以我們只是處理異常?還是有更清潔的替代品? –
@Shankar:請參閱我的答案尋找替代方案。這取決於你想要的東西 - 有時你實際上*想要*異常,因爲它表明事情不像你期望的那樣。 –
如果您確定**只有'Controls'集合中的CheckBox,則不需要處理。如果發生異常,你知道有什麼不對。原始代碼表明他確定。然而,如果您不確定,那麼「類型
你可以使用LINQ來選擇符合此要求的元素:
var controls = groupBox_subset.Controls.OfType<CheckBox>().Where(x => x.Checked);
你知道嗎,你總是一個(或多個)從表達你的意圖所需的語法遠抽象層次:
foreach(CheckBox checkedBox in groupBox_subset.CheckedBoxes()) { ... }
凡CheckedBoxes
擴展方法可以通過查看其他的答案中實現。
只需在1秒內用6個以上的答案搞笑這些簡單的問題 – Skomski
爲什麼讓事情比他們需要的更復雜? –