Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

foreach loop with a condition

Tags:

c#

foreach

Is there a way to do the following in one statement?

foreach(CheckBox subset in groupBox_subset.Controls)
    if(subset.Checked) { ... }
like image 902
Andrew Avatar asked Nov 28 '22 03:11

Andrew


2 Answers

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))
{
   ...
}
like image 162
Jon Skeet Avatar answered Dec 05 '22 17:12

Jon Skeet


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.

like image 21
Daniel Hilgarth Avatar answered Dec 05 '22 17:12

Daniel Hilgarth