C# C关于lambda表达式的解释

C# C关于lambda表达式的解释,c#,linq,lambda,C#,Linq,Lambda,我刚刚找到了这个lambda表达式: myCustomerList.GroupBycust=>cust.CustomerId.Selectgrp=>grp.First 如果我错了,请纠正我,但使用此lambda,您可以在CustomerId上区分myCustomerList,这正是我需要的。但我想弄清楚它是如何工作的 第一步是groupby:这将生成一个字典,使用CustomerId作为字典的键 第二个选择发生了,这是我没有得到的部分。select选择客户,但它如何从字典中选择客户?由于grou

我刚刚找到了这个lambda表达式:

myCustomerList.GroupBycust=>cust.CustomerId.Selectgrp=>grp.First

如果我错了,请纠正我,但使用此lambda,您可以在CustomerId上区分myCustomerList,这正是我需要的。但我想弄清楚它是如何工作的

第一步是groupby:这将生成一个字典,使用CustomerId作为字典的键

第二个选择发生了,这是我没有得到的部分。select选择客户,但它如何从字典中选择客户?由于group by,您需要一个密钥。钥匙在哪里?第一次在这里帮忙怎么样


你能详细地告诉我最后一部分是如何工作的吗?

它不是从字典中选择它,而是说对于GroupBy结果中的每个分组,选择第一个条目。注意,实现IEnumerable

基本上,一个团队有两件事:

钥匙 元素列表
这是从每个组中选择第一个元素。

让我们说您的集合是:

{Name=a, CustomerId=1}
{Name=a, CustomerId=1}
{Name=b, CustomerId=2}
{Name=b, CustomerId=2}
经过分组后由它变成

{ key = 1, Values = {Name=a, CustomerId=1}, {Name=a, CustomerId=1} }
{ key = 2, Values = {Name=a, CustomerId=2}, {Name=a, CustomerId=2} }
最后一次选择(即从上述符号中的值中选择第一次)后,它变为:

{Name=a, CustomerId=1}
{Name=a, CustomerId=2}

因此,它是基于ID的不同客户。

有一个类似的问题[这里][1][1]:但在后台会发生什么。在我看来,当我看到这一点时,它表明一本词典是实现IEnumerable的。当创建该字典时,将执行select。但事实并非如此?@Martijn:不,事实并非如此。直到有人试图从分组中读取数据时,才对分组进行评估——尽管此时输入序列已完全消耗。也许最好让你看看我为GroupBy写的Edulinq博客:我还是不完全明白。当选择发生时,groupBy未被执行?但什么时候执行?因为第一个方法确实选择了每个组的第一个对象。@Martijn:如果不使用select的结果,则不会对其第一个元素要求这样的结果,这意味着它不会对其第一个元素要求分组。您需要仔细阅读延迟执行:提供了一些细节。我知道,例如,当最后调用ToList时,所有内容都会执行。当它被执行时,我回到我的第一个评论,会发生什么?将创建一个实现IEnumerable的字典,并基于此结果,使用第一个方法执行select?如果是这种情况,那么字典的“Key”属性的值是多少?