带条件的Foreach循环
本文关键字:循环 Foreach 条件 | 更新日期: 2023-09-27 18:04:45
是否有办法在一条语句中完成以下操作?
foreach(CheckBox subset in groupBox_subset.Controls)
if(subset.Checked) { ... }
当然:
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
扩展方法可以通过查看其他答案来实现