c# - ILookup<TKey, TVal> 与 IGrouping<TKey, TVal>

标签 c# linq group-by igrouping ilookup

我一直无法阐明 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>

我在下面的类比中是否正确?

  1. IGrouping<TKey, TVal>是单个组(即键控序列),类似于 KeyValuePair<TKey, TVal>其中值实际上是一系列元素(而不是单个元素)
  2. IEnumerable<IGrouping<TKey, TVal>>是这些的序列(类似于迭代 IDictionary<TKey, TVal>
  3. 时得到的结果
  4. 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/

相关文章:

c# - SQL 代码连接到一个由逗号分隔的键引用的表,并对其中的数据求和

c# - UWP - 项目中包含的文件出现 UnauthorizedAccessException

c# - LINQ:从另一个 IEnumerable<T> 创建 IEnumerable<T>?

c# - 类型系统异常 : Enumerable. Cast<int>()

SQL GROUP BY 返回单行

c# - 使用 XmlReader C# 查看元素的所有文本

c# - C# 中的双向 KeyValuePair 集合

c# - 使用反射实例化不可变对象(immutable对象)

mysql - 使用 MySQL GROUP BY,如何控制在非聚合列中选择的默认值?

MYSQL Concat、Left Join、Group解决方案