有没有办法在一个声明中执行以下操作?
foreach(CheckBox subset in groupBox_subset.Controls)
if(subset.Checked) { ... }
答案 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
扩展方法。