有没有办法在一个声明中执行以下操作?
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)