Is there a way to do the following in one statement?
foreach(CheckBox subset in groupBox_subset.Controls)
if(subset.Checked) { ... }
Sure:
foreach (CheckBox subset in groupBox_subset.Controls
.Cast<CheckBox>()
.Where(c => c.Checked))
{
...
}
The Cast
call is required because the Controls
property only implements IEnumerable
, not IEnumerable<T>
, but LINQ basically works on strongly-typed collections. In other words, your existing code is actually closer to:
foreach(Object tmp in groupBox_subset.Controls)
{
CheckBox subset = (CheckBox) tmp;
if(subset.Checked) { ... }
}
If you want to be able to ignore non-CheckBox
controls, you want the OfType
method instead of Cast
in the top snippet:
foreach (CheckBox subset in groupBox_subset.Controls
.OfType<CheckBox>()
.Where(c => c.Checked))
{
...
}
Yes, there is:
foreach(CheckBox subset in groupBox_subset.Controls.Cast<CheckBox>()
.Where(x => x.Checked))
However, this only works if all items in Controls
are of type CheckBox
. If there is at least one item in Controls
that is not a CheckBox
, this will throw an exception. But so does your code.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With