2016-11-04 25 views

回答

7

(我假设我们只谈论LINQ到对象。)

它仍然推迟在,直到你开始要求的结果,它不会读取源收集的。但是,是的,一旦你要求第一个结果,它确实会读取整个集合。它只会读取一次源,并且只会向每个元素请求一次分组键。正如你怀疑的那样,所有的结果都被缓冲在内存中。

我的Edulinq blog post on GroupBy(Edulinq基本上是为了教育起见将LINQ重新实现为对象)显示了一个示例实现,尽管这符合ToLookup

+2

[参考实现](https://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,1ee6acd1e1344f76)使用'GroupedEnumerable',它只是['Lookup'] (https://referencesource.microsoft.com/System.Core/R/cb695d4a973ef608.html)。 'Lookup'是'Dictionary >'的一个精简版本,同时重新实现'Dictionary'和'List'。 – Johnbot