.ToLookup<TSource, TKey>
返回一个ILookup<TKey, TSource>
.ILookup<TKey, TSource>
还实现了接口IEnumerable<IGrouping<TKey, TSource>>
.
.GroupBy<TSource, TKey>
返回一个IEnumerable<IGrouping<Tkey, TSource>>
.
ILookup具有方便的索引器属性,因此它可以以字典(或类似查找)的方式使用,而GroupBy则不能.GroupBy没有索引器是一种痛苦的工作; 几乎是你可以引用返回对象的唯一方法是循环它(或使用另一个LINQ扩展方法).换句话说,任何GroupBy工作的情况下,ToLookup也会起作用.
这一切让我想到为什么我会打扰GroupBy?为什么要存在?
Eri*_*ert 161
为什么我会打扰GroupBy?为什么要存在?
当您在表示具有十亿行的远程数据库表的对象上调用ToLookup时会发生什么?
通过线路发送十亿行,并在本地构建查找表.
在这样的对象上调用GroupBy时会发生什么?
构建查询对象; 故事结局.
当枚举该查询对象时,表的分析在数据库服务器上完成,并且分组的结果一次一个地按需发回.
从逻辑上讲,它们是相同的,但每个的性能影响是完全不同的.调用ToLookup意味着我想要一个由组织组织的整个事物的缓存.调用GroupBy意味着"我正在构建一个对象来表示'如果我按组组织它们会是什么样的?'"
All*_*nek 15
两者相似,但用于不同的场景..ToLookup()
返回已经包含所有组(但不是组的内容)的即用型对象.另一方面,.GroupBy()
返回一个延迟加载的组序列.
不同的LINQ提供者可能对组的急切和延迟加载具有不同的行为.使用LINQ-to-Object它可能没什么区别,但是使用LINQ-to-SQL(或LINQ-to-EF等),分组操作是在数据库服务器而不是客户端上执行的,因此您可能需要对组密钥(生成一个HAVING
子句)进行额外的过滤,然后只获取一些组而不是所有组..ToLookup()
不会允许这样的语义,因为所有项目都是急切分组的.