Вопрос по asp.net, webforms, c#, linq – LINQ: получить все выбранные значения CheckBoxList с помощью лямбда-выражения

36

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

Вот текущая реализация:

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

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

Обратите внимание, чтоCast на самом деле имеет соответствующий синтаксический сахар - вы могли бы так же хорошо написатьfrom ListItem item in chkBoxList.Items. Pavel Minaev
Фон в ролях ():.Cast<ListItem>() требуется, потому что коллекция Предметов CheckBoxList имеет типListItemCollectionи он не имеетWhere метод расширения. Вот возникшее исключение: не удалось найти реализацию шаблона запроса для типа источника «System.Web.UI.WebControls.ListItemCollection». & APOS; где & APOS; не найдено. Рассмотрим явное указание типа переменной диапазона «элемент». p.campbell
@pcampbell - TheCast Метод был создан, чтобы позволить вам обойти только эти проблемы. В основном это позволяет вам использовать новые блестящие операторы LINQ даже с более старыми типами, которые не реализуютIEnumerable<T>. :) Andrew Hare

Ваш Ответ

2   ответа
22

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

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

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

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

РЕДАКТИРОВАТЬ: для GONeale:

IEnumerable<int> allChecked = chkBoxList.Items
                                        .Cast<ListItem>()
                                        .Where(item => item.Selected)
                                        .Select(item => int.Parse(item.Value));
Спасибо Джон. Я использовал это неявное приведение в качестве улучшения моего запроса. p.campbell
Джон, что будет лямбда-эквивалент [эквивалентным методом расширения]?
Джон, хорошо, так.Cast<ListItem>() самый простой в беглом синтаксисе. Вас понял. Думаю, вы указали другой способ сделать это неявно или что-то. Грэхем
@ GONeale: включили это в редактирование.
Спасибо Джон. Как вы следите за всеми комментариями? Вам отправили электронное письмо? ;)
86

Выare с помощью лямбда-выражений - они просто скрываются при использовании операторов запросов C #.

Считайте, что это:

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 методы), и вы даже не знали об этом! Этот запрос в порядке, и я бы не стал его менять.

Спасибо, Андрей. Я кое-что узнал сегодня из твоего ответа, так что спасибо. Я отмечу это как «ответ». хотя сейчас я спрашиваю себя, что более читабельно для разработчика. Еще раз спасибо! p.campbell

Похожие вопросы