LINQ:使用 Lambda 表达式获取 CheckBoxList 的所有选定值
Posted
技术标签:
【中文标题】LINQ:使用 Lambda 表达式获取 CheckBoxList 的所有选定值【英文标题】:LINQ: Get all selected values of a CheckBoxList using a Lambda expression 【发布时间】:2010-11-14 19:47:24 【问题描述】:假设您要检索<asp:CheckBoxList>
中所有选定复选框的值的List
或IEnumerable
。
这是当前的实现:
IEnumerable<int> allChecked = (from item in chkBoxList.Items.Cast<ListItem>()
where item.Selected
select int.Parse(item.Value));
问题:您将如何使用 lambda 表达式或 lambda 语法改进此 LINQ 查询?
【问题讨论】:
Cast() 的背景:.Cast<ListItem>()
是必需的,因为 CheckBoxList 的 Items 集合的类型为 ListItemCollection
,并且它没有 Where
扩展方法。这是引发的异常:找不到源类型“System.Web.UI.WebControls.ListItemCollection”的查询模式的实现。 '哪里' 没有找到。考虑明确指定范围变量“item”的类型。
@pcampbell - 创建Cast
方法是为了让您解决这些问题。基本上,它允许您使用新的闪亮 LINQ 运算符,即使是未实现 IEnumerable<T>
的旧类型。 :)
注意Cast
实际上有相应的语法糖——你也可以写from ListItem item in chkBoxList.Items
。
【参考方案1】:
您正在使用 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
方法的参数),而您甚至都不知道!这个查询很好,我根本不会改变它。
【讨论】:
谢谢安德鲁。我今天从你的回答中学到了一些东西,所以谢谢你。我会将此标记为“答案”,尽管现在我在质疑自己,这对开发人员来说更具可读性。再次感谢!【参考方案2】:我会通过调用 Cast<T>
来改进查询表达式:
IEnumerable<int> allChecked = from ListItem item in chkBoxList.Items
where item.Selected
select int.Parse(item.Value);
当您指定范围变量的类型时,编译器会为您插入对Cast<T>
的调用。
除此之外,我完全同意 Andrew。
编辑:对于 GONeale:
IEnumerable<int> allChecked = chkBoxList.Items
.Cast<ListItem>()
.Where(item => item.Selected)
.Select(item => int.Parse(item.Value));
【讨论】:
谢谢乔恩。我已使用此隐式强制转换来增强我的查询。 乔恩,什么是等效的 lambda [基于扩展方法]? 谢谢乔恩。你如何跟上所有的cmets?你收到一封电子邮件吗? ;) Jon,好的,所以.Cast<ListItem>()
是流利语法中最简单的。被我耍到了。以为您是在暗示另一种方式来隐含地或其他方式。格雷厄姆以上是关于LINQ:使用 Lambda 表达式获取 CheckBoxList 的所有选定值的主要内容,如果未能解决你的问题,请参考以下文章
帮助我使用实体框架从 SQL 转换为 linq 嵌套 lambda 表达式
在 LINQ Lambda 表达式中使用 GroupBy、Count 和 Sum
如何使用 Lambda 或 Linq 将匿名类型转换为原始类型成员