2011-08-08 177 views
4

有沒有辦法在一個語句中執行以下操作?帶條件的foreach循環

foreach(CheckBox subset in groupBox_subset.Controls) 
    if(subset.Checked) { ... } 
+0

只需在1秒內用6個以上的答案搞笑這些簡單的問題 – Skomski

+0

爲什麼讓事情比他們需要的更復雜? –

回答

8

肯定的:

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)) 
{ 
    ... 
} 
7

是的,有:

foreach(CheckBox subset in groupBox_subset.Controls.Cast<CheckBox>() 
                .Where(x => x.Checked)) 

然而,這僅在Controls所有項目CheckBox類型的作品。如果Controls中至少有一個項目不是CheckBox,則會引發異常。但你的代碼也是如此。

+0

所以我們只是處理異常?還是有更清潔的替代品? –

+2

@Shankar:請參閱我的答案尋找替代方案。這取決於你想要的東西 - 有時你實際上*想要*異常,因爲它表明事情不像你期望的那樣。 –

+2

如果您確定**只有'Controls'集合中的CheckBox,則不需要處理。如果發生異常,你知道有什麼不對。原始代碼表明他確定。然而,如果您不確定,那麼「類型」將是Darin首先顯示並由Jon解釋的「Cast 」的更好替代。 –

7

你可以使用LINQ來選擇符合此要求的元素:

var controls = groupBox_subset.Controls.OfType<CheckBox>().Where(x => x.Checked); 
3

你知道嗎,你總是一個(或多個)從表達你的意圖所需的語法遠抽象層次:

foreach(CheckBox checkedBox in groupBox_subset.CheckedBoxes()) { ... } 

CheckedBoxes擴展方法可以通過查看其他的答案中實現。