有没有办法在一个语句中执行以下操作?带条件的foreach循环
foreach(CheckBox subset in groupBox_subset.Controls)
if(subset.Checked) { ... }
有没有办法在一个语句中执行以下操作?带条件的foreach循环
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
,则会引发异常。但你的代码也是如此。
所以我们只是处理异常?还是有更清洁的替代品? –
@Shankar:请参阅我的答案寻找替代方案。这取决于你想要的东西 - 有时你实际上*想要*异常,因为它表明事情不像你期望的那样。 –
如果您确定**只有'Controls'集合中的CheckBox,则不需要处理。如果发生异常,你知道有什么不对。原始代码表明他确定。然而,如果您不确定,那么“类型
你可以使用LINQ来选择符合此要求的元素:
var controls = groupBox_subset.Controls.OfType<CheckBox>().Where(x => x.Checked);
你知道吗,你总是一个(或多个)从表达你的意图所需的语法远抽象层次:
foreach(CheckBox checkedBox in groupBox_subset.CheckedBoxes()) { ... }
凡CheckedBoxes
扩展方法可以通过查看其他的答案中实现。
只需在1秒内用6个以上的答案搞笑这些简单的问题 – Skomski
为什么让事情比他们需要的更复杂? –