有没有办法在一个声明中执行以下操作?
foreach(CheckBox subset in groupBox_subset.Controls)
if(subset.Checked) { ... }
Run Code Online (Sandbox Code Playgroud)
当然:
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)
就在这里:
foreach(CheckBox subset in groupBox_subset.Controls.Cast<CheckBox>()
.Where(x => x.Checked))
Run Code Online (Sandbox Code Playgroud)
但是,这仅适用于所有Controls类型的项目CheckBox.如果其中至少有一个项Controls不是a CheckBox,则会抛出异常.但你的代码也是如此.
您可以使用LINQ选择符合此要求的元素:
var controls = groupBox_subset.Controls.OfType<CheckBox>().Where(x => x.Checked);
Run Code Online (Sandbox Code Playgroud)