具有条件的foreach循环

时间:2011-08-08 16:47:21

标签: c# foreach

有没有办法在一个声明中执行以下操作?

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

4 个答案:

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

答案 1 :(得分:7)

是的,有:

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

但是,仅当Controls中的所有项目都属于CheckBox类型时,此方法才有效。如果Controls中至少有一个项目不是CheckBox,则会引发异常。但你的代码也是如此。

答案 2 :(得分:7)

您可以使用LINQ选择符合此要求的元素:

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

答案 3 :(得分:3)

你知道,你总是有一个(或多个)抽象层次,远离表达你意图的理想语法:

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

通过查看其他答案可以实现CheckedBoxes扩展方法。