具有条件的foreach循环

And*_*rew 4 c# foreach

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

foreach(CheckBox subset in groupBox_subset.Controls)
    if(subset.Checked) { ... }
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 8

当然:

foreach (CheckBox subset in groupBox_subset.Controls
                                           .Cast<CheckBox>()
                                           .Where(c => c.Checked))
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

Cast调用是必需的,因为该Controls属性仅实现IEnumerable,而不是IEnumerable<T>,但LINQ基本上适用于强类型集合.换句话说,您现有的代码实际上更接近:

foreach(Object tmp in groupBox_subset.Controls)
{
    CheckBox subset = (CheckBox) tmp;
    if(subset.Checked) { ... }
}
Run Code Online (Sandbox Code Playgroud)

如果您希望能够忽略非CheckBox控件,则需要使用OfType方法而不是Cast顶部代码段:

foreach (CheckBox subset in groupBox_subset.Controls
                                           .OfType<CheckBox>()
                                           .Where(c => c.Checked))
{
   ...
}
Run Code Online (Sandbox Code Playgroud)


Dan*_*rth 7

就在这里:

foreach(CheckBox subset in groupBox_subset.Controls.Cast<CheckBox>()
                                                   .Where(x => x.Checked))
Run Code Online (Sandbox Code Playgroud)

但是,这仅适用于所有Controls类型的项目CheckBox.如果其中至少有一个项Controls不是a CheckBox,则会抛出异常.但你的代码也是如此.

  • @Shankar:看看我的答案.这取决于你想要什么 - 有时你实际上*想要*异常,因为它表明某些东西不像你期望的那样. (2认同)
  • 如果你确定**在`Controls`集合中只有`CheckBox`,则不需要处理.如果发生异常,您就会知道出错了.原始代码表明他确定.但是,如果你不确定,`OfType <T>`将是一个更好的替代`Cast <T>`,由Darin首先显示,随后由Jon解释. (2认同)

Dar*_*rov 7

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

var controls = groupBox_subset.Controls.OfType<CheckBox>().Where(x => x.Checked);
Run Code Online (Sandbox Code Playgroud)