цикл foreach с условием - PullRequest
       3

цикл foreach с условием

4 голосов
/ 08 августа 2011

Есть ли способ сделать следующее в одном утверждении?

foreach(CheckBox subset in groupBox_subset.Controls)
    if(subset.Checked) { ... }

Ответы [ 4 ]

8 голосов
/ 08 августа 2011

Конечно:

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))
{
   ...
}
7 голосов
/ 08 августа 2011

Вы можете использовать LINQ для выбора элементов, соответствующих этому требованию:

var controls = groupBox_subset.Controls.OfType<CheckBox>().Where(x => x.Checked);
7 голосов
/ 08 августа 2011

Да, есть:

foreach(CheckBox subset in groupBox_subset.Controls.Cast<CheckBox>()
                                                   .Where(x => x.Checked))

Однако это работает, только если все элементы в Controls имеют тип CheckBox. Если в Controls есть хотя бы один элемент, который не является CheckBox, это вызовет исключение. Но ваш код тоже.

3 голосов
/ 08 августа 2011

Вы знаете, что вы всегда на один (или более) уровень абстракции от желаемого синтаксиса, который выражает ваше намерение:

foreach(CheckBox checkedBox in groupBox_subset.CheckedBoxes()) { ... }

Где метод расширения CheckedBoxes может быть реализован, если посмотреть надругие ответы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...