2011-08-08 178 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扩展方法可以通过查看其他的答案中实现。