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 с помощью лямбда-выражения или синтаксиса лямбда?
Ответы
Ответ 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));