考虑一种情况,您希望在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查询?
答案 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表达式(它们是Where
和Select
方法的参数),您甚至不知道它!这个查询很好,我根本不会改变它。
答案 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));