C# Explanation about a lambda expression
我刚找到这个lambda表达式:
myCustomerList.GroupBy(cust => cust.CustomerId).Select(grp => grp.First());。
如果我是错的,请纠正我,但是有了这个lambda,你就可以区分myCustomerList和CustomerId上的myCustomerList,这正是我需要的。但我想弄清楚它是如何工作的。
第一步是groupby:这就产生了一个字典,IGouping,其中CustomerId是字典的键。
第二个选择发生了,这是我没有得到的部分。select选择一个客户,但是它如何从字典中选择一个客户呢?因为group by,您需要一个密钥。钥匙在哪里?那么,First()是如何帮助这里的呢?
你能详细地告诉我最后一部分是如何工作的吗?
- 有一个类似的问题[这里][1][1]:stackoverflow.com/questions/436954/whos-on-dictionary-first
它不是从字典中选择它——它是说,对于GroupBy的结果中的每个分组,选择第一个条目。注意,IGrouping执行IEnumerable。
基本上,一个小组有两件事:
这是从每个组中选择第一个元素。
- 但是在背景中会发生什么。当我看到这一点时,在我看来,这意味着一本字典的编制(实现了IEnumerable)。当创建字典时,执行选择。但事实并非如此?
- @马蒂:不,不是这样的。直到有人试图从分组中读取数据时,仍然不会对分组进行评估——尽管此时输入序列已经完全被消耗掉了。最好是在我为Groupby撰写的Edulinq博客上指出你:msmvps.com/blog s/jonskeet/archive/2011/01/01/…
- 我还是不完全明白。选择发生时GroupBy不是ExecuteC?但什么时候执行呢?因为first()方法确实选择了每个组的第一个对象。
- @Martijn:如果你不使用EDOCX1的结果(0),就不会对它的第一个元素有任何要求——这意味着它不会要求对它的第一个元素进行分组。您需要了解延迟执行:msmvps.com/blogs/jon ou skeet/archive/2010/09/03/…提供了一些详细信息。
- 我知道,当(例如)在末尾调用ToList()时,所有的操作都会被执行。当它被执行时,我回到我的第一条评论,会发生什么?创建了一个字典(实现IEnumerable),并基于此结果,使用第一个()方法执行select?如果是这样,字典的'key'属性值是多少?
- @martijn:内部创建的字典类似于Dictionary—每个分组代表字典中的一个条目、键和相应值的列表。因此,在每个值列表中调用First。这里的关键属性是客户ID。我在前面的评论中引用的博客文章中提供了一个示例实现-我建议您解决这个问题。
让我们说你的收藏是:
1 2 3 4
| {Name=a, CustomerId=1}
{Name=a, CustomerId=1}
{Name=b, CustomerId=2}
{Name=b, CustomerId=2} |
分组后,它变成
1 2
| { key = 1, Values = {Name=a, CustomerId=1}, {Name=a, CustomerId=1} }
{ key = 2, Values = {Name=a, CustomerId=2}, {Name=a, CustomerId=2} } |
号
最后一次选择后(即从上述符号中的值中选择第一个值),它变为:
1 2
| {Name=a, CustomerId=1}
{Name=a, CustomerId=2} |
因此,它是基于ID的不同客户。