C# 带条件的foreach循环

C# 带条件的foreach循环,c#,foreach,C#,Foreach,有没有一种方法可以在一个语句中执行以下操作 foreach(CheckBox subset in groupBox_subset.Controls) if(subset.Checked) { ... } 是的,有: foreach(CheckBox subset in groupBox_subset.Controls.Cast<CheckBox>() .Where(x =&

有没有一种方法可以在一个语句中执行以下操作

foreach(CheckBox subset in groupBox_subset.Controls)
    if(subset.Checked) { ... }
是的,有:

foreach(CheckBox subset in groupBox_subset.Controls.Cast<CheckBox>()
                                                   .Where(x => x.Checked))
foreach(groupBox\u subset.Controls.Cast()中的复选框子集)
.其中(x=>x.Checked))
但是,这仅在
控件
中的所有项都属于
复选框
类型时有效。如果
控件
中至少有一项不是
复选框
,这将引发异常。但您的代码也是如此。

当然:

foreach (CheckBox subset in groupBox_subset.Controls
                                           .Cast<CheckBox>()
                                           .Where(c => c.Checked))
{
   ...
}
如果希望能够忽略非
复选框
控件,则希望在顶部代码段中使用该方法而不是
Cast

foreach (CheckBox subset in groupBox_subset.Controls
                                           .OfType<CheckBox>()
                                           .Where(c => c.Checked))
{
   ...
}
foreach(groupBox\u subset.Controls中的复选框子集)
第()类
.其中(c=>c.Checked))
{
...
}

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

var controls = groupBox_subset.Controls.OfType<CheckBox>().Where(x => x.Checked);
var controls=groupBox\u subset.controls.OfType()。其中(x=>x.Checked);

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

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

其中,
复选框
扩展方法可以通过查看其他答案来实现。

让这些简单问题在1秒内有6个以上的答案,那么我们只处理异常?还是有更干净的选择?@Shankar:看看我的答案。这取决于您想要什么-有时您确实想要异常,因为它表明某些内容与您期望的不一样。如果您确定该
控件
集合中只有
复选框
es,则无需处理。如果出现异常,您就知道出了问题。原始代码表明他是肯定的。然而,如果您不确定,
类型的
将是
Cast
的更好选择,如Darin首先展示的,随后由Jon解释。
foreach(CheckBox checkedBox in groupBox_subset.CheckedBoxes()) { ... }