Linq的GroupBy方法如何延迟执行?

lmc*_*iro 2 c# linq group-by

我发现了这个问题,但它还没有答案...... Linq Group使用什么算法?

由于您必须遍历整个源集合以了解所有组,因此如何延迟其执行?它只会迭代源集合一次吗?它是否使用缓冲区?

Jon*_*eet 7

(我假设我们只讨论LINQ to Objects.)

它仍然延迟,直到你开始要求结果,它根本不会读取源集合.但是,是的,一旦你要求第一个结果,它确实会读取整个集合.它只读取一次源,它只询问每个元素的分组键一次.正如您所怀疑的那样,所有结果都会缓存在内存中.

在GroupBy上的Edulinq博客文章(Edulinq基本上是为了教育而重新实现LINQ to Objects)显示了一个示例实现,尽管就是这样ToLookup.

  • [参考实现](https://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,1ee6acd1e1344f76)使用`GroupedEnumerable`,它只是[`Lookup`]的包装器(https: //referencesource.microsoft.com/System.Core/R/cb695d4a973ef608.html).`Lookup`是`Dictionary <TKey,List <TValue >>`的精简版,带有`Dictionary`和`List`的重新实现. (2认同)