elu*_*id8 5 .net c# linq lambda grouping
我一直在使用LINQ和Lambda表达式,但我对该功能的各个方面仍然不太满意.
所以,当我最近在一个项目上工作时,我需要根据某些属性获得一个独特的对象列表,然后我遇到了这个代码.它有效,我对此很好,但我想了解分组机制.如果我可以提供帮助,我不喜欢简单地插入代码并远离问题.
无论如何,代码是:
var listDistinct
=list.GroupBy(
i => i.value1,
(key, group) => group.First()
).ToList();
Run Code Online (Sandbox Code Playgroud)
在上面的代码示例中,您首先调用GroupBy并传递一个lambda表达式,告诉它按属性进行分组value1.代码的第二部分引起了混淆.
我理解这key是value1在(key, group)声明中引用,但我仍然没有把我的头脑包围在正在发生的一切.
什么表达
Run Code Online (Sandbox Code Playgroud)list.GroupBy( i => i.value1, (key, group) => group.First())做?
这就产生了一个查询被执行时,分析该序列list以产生组的序列,然后投影组的序列到一个新的序列.在这种情况下,投影是从每组中取出第一项.
第一个lambda选择构建组的"密钥".在这种情况下,列表中具有相同value1属性的所有项都放在一个组中.他们共享的价值成为集团的"关键".
第二个lambda来自关键组的序列; 就好像你已经完成了select一系列的团队.此查询的净效果是从列表中选择一组元素,使得结果序列的每个元素具有不同的value1属性值.
文档在这里:
http://msdn.microsoft.com/en-us/library/bb549393.aspx
如果文档不清楚,我很乐意将批评转交给文档管理员.
此代码
group用作lambda的形式参数.不是group保留关键字?
不,group是一个上下文关键字.LINQ被添加到C#3.0中,因此可能已经存在使用group作为标识符的现有程序.如果group成为保留关键字,这些程序在重新编译时将被破坏.相反,group它只是在查询表达式的上下文中的关键字.在查询表达式之外,它是普通标识符.
如果要引起注意它是普通标识符的事实,或者如果要group在查询表达式中使用标识符,则可以通过使用前缀来告诉编译器"将其视为标识符,而不是关键字" @.如果我写上面的代码,我会说
list.GroupBy(
i => i.value1,
(key, @group) => @group.First())
Run Code Online (Sandbox Code Playgroud)
说清楚.
C#中还有其他上下文关键字吗?
是.我在这里记录了它们:
http://ericlippert.com/2009/05/11/reserved-and-contextual-keywords/
| 归档时间: |
|
| 查看次数: |
2535 次 |
| 最近记录: |