你能解释一下这个lambda分组功能吗?

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.代码的第二部分引起了混淆.

我理解这keyvalue1(key, group)声明中引用,但我仍然没有把我的头脑包围在正在发生的一切.

Eri*_*ert 7

什么表达

list.GroupBy(
    i => i.value1,
    (key, group) => group.First())
Run Code Online (Sandbox Code Playgroud)

做?

这就产生了一个查询被执行时,分析该序列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/