Подтвердить что ты не робот

LINQ: получить все выбранные значения CheckBoxList, используя выражение Lambda

Рассмотрим сценарий, в котором вы хотите получить значения List или IEnumerable для всех выбранных флажков в <asp:CheckBoxList>.

Здесь текущая реализация:

IEnumerable<int> allChecked = (from item in chkBoxList.Items.Cast<ListItem>() 
                               where item.Selected 
                               select int.Parse(item.Value));

Вопрос. Как бы вы улучшили этот запрос LINQ с помощью лямбда-выражения или синтаксиса лямбда?

4b9b3361

Ответ 1

Вы используете лямбда-выражения - они просто скрыты при использовании операторов запросов С#.

Учтите, что это:

IEnumerable<int> allChecked = (from item in chkBoxList.Items.Cast<ListItem>() 
                               where item.Selected 
                               select int.Parse(item.Value));

Получается скомпилировано:

IEnumerable<int> allChecked = chkBoxList.Items.Cast<ListItem>()
                              .Where(i => i.Selected)
                              .Select(i => int.Parse(i.Value));

Как вы можете видеть, вы уже используете два лямбда-выражения (они являются параметрами методов Where и Select), и вы даже не знали об этом! Этот вопрос в порядке, и я бы вообще не изменил его.

Ответ 2

Я бы улучшил выражение запроса, сделав вызов Cast<T> неявным:

IEnumerable<int> allChecked = from ListItem item in chkBoxList.Items 
                              where item.Selected 
                              select int.Parse(item.Value);

Когда вы указываете тип переменной диапазона, компилятор вставляет вызов Cast<T> для вас.

Кроме этого, я полностью согласен с Эндрю.

EDIT: для GONeale:

IEnumerable<int> allChecked = chkBoxList.Items
                                        .Cast<ListItem>()
                                        .Where(item => item.Selected)
                                        .Select(item => int.Parse(item.Value));