最佳答案
我一直很难清楚地表达 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>
,其中的值实际上是一系列元素