我一直无法阐明 ILookup<TKey, TVal>
之间的差异和 IGrouping<TKey, TVal>
,并且很好奇我现在是否理解正确。 LINQ 通过生成 IGrouping
的序列使问题更加复杂项目同时还给我 ToLookup
扩展方法。所以在我仔细观察之前,感觉它们是一样的。
var q1 =
from n in N
group n by n.MyKey into g
select g;
// q1 is IEnumerable<IGrouping<TKey, TVal>>
相当于:
var q2 = N.GroupBy(n => n.MyKey, n => n);
// q2 is IEnumerable<IGrouping<TKey, TVal>>
看起来很像:
var q3 = N.ToLookup(n => n.MyKey, n => n);
// q3 is ILookup<TKey, TVal>
我在下面的类比中是否正确?
- 安
IGrouping<TKey, TVal>
是单个组(即键控序列),类似于KeyValuePair<TKey, TVal>
其中值实际上是一系列元素(而不是单个元素) - 安
IEnumerable<IGrouping<TKey, TVal>>
是这些的序列(类似于迭代IDictionary<TKey, TVal>
时得到的结果
- 安
ILookup<TKey, TVal>
更像是一个IDictionary<TKey, TVal>
其中值实际上是一个元素序列
最佳答案
是的,所有这些都是正确的。
和ILookup<TKey, TValue>
还扩展了 IEnumerable<IGrouping<TKey, TValue>>
因此您可以遍历所有键/集合对以及(或代替)查找特定键。
基本想到ILookup<TKey,TValue>
就像IDictionary<TKey, IEnumerable<TValue>>
.
请记住 ToLookup
是“立即执行”操作(立即执行),而 GroupBy
被推迟。碰巧的是,当您开始拉取 IGrouping
时,使用“拉取 LINQ”的方式。来自 GroupBy
的结果,它无论如何都必须读取所有数据(因为你不能中途切换组),而在其他实现中它可能能够产生流式结果。 (在 Push LINQ 中确实如此;我希望 LINQ to Events 是相同的。)
关于c# - ILookup<TKey, TVal> 与 IGrouping<TKey, TVal>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1337539/