我一直很难阐明之间的差异ILookup<TKey, TVal> http://msdn.microsoft.com/en-us/library/bb534291.aspx and IGrouping<TKey, TVal> http://msdn.microsoft.com/en-us/library/bb344977.aspx,并且很好奇我现在是否理解正确。 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>
我下面的类比正确吗?
- An
IGrouping<TKey, TVal>
是单个组(即键控序列),类似于KeyValuePair<TKey, TVal>
其中值实际上是元素序列(而不是单个元素)
- An
IEnumerable<IGrouping<TKey, TVal>>
是这些序列的序列(类似于迭代一个IDictionary<TKey, TVal>
- An
ILookup<TKey, TVal>
更像是一个IDictionary<TKey, TVal>
其中值实际上是元素序列
是的,所有这些都是正确的。
And ILookup<TKey, TValue>
还延伸IEnumerable<IGrouping<TKey, TValue>>
因此您可以迭代所有键/集合对以及(或代替)仅查找特定键。
我基本上想到ILookup<TKey,TValue>
如同IDictionary<TKey, IEnumerable<TValue>>
.
请记住ToLookup
是“立即执行”操作(立即执行),而GroupBy
被推迟。碰巧的是,按照“拉 LINQ”的工作方式,当您开始拉时IGrouping
s 来自 a 的结果GroupBy
,它无论如何都必须读取所有数据(因为您无法中途切换组),而在其他实现中它可能能够生成流结果。 (在 Push LINQ 中确实如此;我希望 LINQ to Events 也是如此。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)