LINQ:使用Lambda表达式获取CheckBoxList的所有选定值

时间:2009-07-28 18:46:32

标签: c# asp.net linq webforms

考虑一种情况,您希望在List中检索所有选中复选框的IEnumerable<asp:CheckBoxList>个值。

以下是当前的实施:

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

问题:您如何使用lambda表达式或lambda语法改进此LINQ查询?

2 个答案:

答案 0 :(得分:86)

使用lambda表达式 - 它们只是被你使用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));

正如您所看到的,您已经在使用两个lambda表达式(它们是WhereSelect方法的参数),您甚至不知道它!这个查询很好,我根本不会改变它。

答案 1 :(得分: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));