LINQ从IGrouping转换为Lookup

时间:2009-09-27 07:26:39

标签: linq lambda igrouping ilookup

我有两个ILookup类型的变量。我想使用Union或Concat组合它们的值并将结果分配给相同类型的第三个变量。 Union和Concat都返回IGrouping。将IGrouping转换为ILookup一定很简单,但我不能这样做! :-( IGrouping暴露了Key,所以我正在努力寻找Lookup的第二个参数......任何帮助都会非常多,非常感激。

1 个答案:

答案 0 :(得分:9)

我认为您需要首先展平序列,才能使用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的形式,它带有两个代表:一个用于将原始序列中的项目转换为集合,另一个用于将原始集合中的项目(即组)和项目中的项目转换为返回的集合(即与该组的键匹配的项)到达结果项。这是最简单的方法(我认为!)将分组展平为一系列带有键的项目。

以上未经过测试,因此可能完全错误。它的效率也相对较低......令人遗憾的是,无法直接构建Lookup的实例。当然,您可以自己实施ILookup