带条件的Foreach循环

本文关键字:循环 Foreach 条件 | 更新日期: 2023-09-27 18:04:45

是否有办法在一条语句中完成以下操作?

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

带条件的Foreach循环

当然:

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,则会抛出异常。但是你的代码也是如此。

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

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

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

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

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