LINQ 从 IGrouping 转换为 Lookup

标签 linq lambda igrouping ilookup

我有两个 ILookup 类型的变量。我想使用 Union 或 Concat 组合它们的值并将结果分配给相同类型的第三个变量。 Union 和 Concat 都返回 IGrouping。将 IGrouping 转换为 ILookup 一定非常简单,但我就是做不到! :-( IGrouping 仅公开键,因此我正在努力处理查找的第二个参数......任何帮助将非常非常感谢。

最佳答案

我认为您需要首先展平序列,才能使用ToLookup:

var lookup = first.Concat(second)
                  .SelectMany(group => group,
                              (group, item) => new { Key = group.Key, 
                                                     Item = item })
                  .ToLookup(x => x.Key, x => x.Item);

它使用 SelectMany 的形式,它接受两个委托(delegate):一个将原始序列中的项目转换为集合,另一个将原始集合中的项目(即组)和返回集合中的项目(即与该组的键匹配的项目)以获取结果项目。这是将分组扁平化为带有键的项目序列的最简单方法(我认为!)。

以上内容未经测试,因此可能完全错误。它的效率也相对较低……遗憾的是没有办法直接构建 Lookup 的实例。当然,您可以自己实现 ILookup

关于LINQ 从 IGrouping 转换为 Lookup,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1483013/

相关文章:

Java 8 foreach 将子对象添加到新列表

c# - Lambda 事件处理程序范围

c# - 从 IGrouping 中检索所有值

c# - 如何通过键从 .NET IGrouping 返回值?

c# - 如何检查我的收藏中是否有符合条件的记录?

c# - 为什么我应该使用 Any 方法而不是 Count?

c# - 获取在 .NET Core 中实现接口(interface)的所有类型

c# - IEnumerable<IGrouping> 到 IEnumerable<List>

c# - 用linq减去两个表

c# - 将 ObservableCollection 绑定(bind)到 WPF 中的 ComboBox