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> 中所有选定复选框的值的ListIEnumerable

这是当前的实现:

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

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

【问题讨论】:

Cast() 的背景:.Cast&lt;ListItem&gt;() 是必需的,因为 CheckBoxList 的 Items 集合的类型为 ListItemCollection,并且它没有 Where 扩展方法。这是引发的异常:找不到源类型“System.Web.UI.WebControls.ListItemCollection”的查询模式的实现。 '哪里' 没有找到。考虑明确指定范围变量“item”的类型。 @pcampbell - 创建Cast 方法是为了让您解决这些问题。基本上,它允许您使用新的闪亮 LINQ 运算符,即使是未实现 IEnumerable&lt;T&gt; 的旧类型。 :) 注意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 表达式(它们是 WhereSelect 方法的参数),而您甚至都不知道!这个查询很好,我根本不会改变它。

【讨论】:

谢谢安德鲁。我今天从你的回答中学到了一些东西,所以谢谢你。我会将此标记为“答案”,尽管现在我在质疑自己,这对开发人员来说更具可读性。再次感谢!【参考方案2】:

我会通过调用 Cast&lt;T&gt; 来改进查询表达式:

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

当您指定范围变量的类型时,编译器会为您插入对Cast&lt;T&gt; 的调用。

除此之外,我完全同意 Andrew。

编辑:对于 GONeale:

IEnumerable<int> allChecked = chkBoxList.Items
                                        .Cast<ListItem>()
                                        .Where(item => item.Selected)
                                        .Select(item => int.Parse(item.Value));

【讨论】:

谢谢乔恩。我已使用此隐式强制转换来增强我的查询。 乔恩,什么是等效的 lambda [基于扩展方法]? 谢谢乔恩。你如何跟上所有的cmets?你收到一封电子邮件吗? ;) Jon,好的,所以.Cast&lt;ListItem&gt;() 是流利语法中最简单的。被我耍到了。以为您是在暗示另一种方式来隐含地或其他方式。格雷厄姆

以上是关于LINQ:使用 Lambda 表达式获取 CheckBoxList 的所有选定值的主要内容,如果未能解决你的问题,请参考以下文章

帮助我使用实体框架从 SQL 转换为 linq 嵌套 lambda 表达式

在 LINQ Lambda 表达式中使用 GroupBy、Count 和 Sum

如何使用 Lambda 或 Linq 将匿名类型转换为原始类型成员

LINQ TO SQL

用于从实体类及其导航属性中选择多个列的 Linq Lambda 表达式

如何解决 C# 中 linq 的 lambda 表达式中的对象引用错误?