LINQ,对IEnumerable <object []> </object []>进行分组

时间:2011-08-05 23:45:52

标签: linq group-by ienumerable linq-to-objects grouping

我有以下元素(可能超过两个):

new[] { new[] { "A" }, new[] { "B", "C" } }
new[] { new[] { "D" }, new[] { "E", "F" } }

我想将它们分组如下:

“A”,“D”

“B”,“C”,“E”,“F”

什么是最佳方式(或至少是一种好方法)?

是否有可能以某种方式存储第一对“D”(以及第二对E“和”F“)在开头不在同一个数组中?

2 个答案:

答案 0 :(得分:1)

我昨天碰到了这个。不是最具可读性,但它实现了目标。

new [] { 
    new[] { new[] { "A" }, new[] { "B", "C" } },
    new[] { new[] { "D" }, new[] { "E", "F" } }
}.SelectMany((x, arrayPos) => x.Select((y, itemPos) => new { y, arrayPos, itemPos }))
    .GroupBy(x => new { x.itemPos })
.Select(x => x.SelectMany(y => y.y.Select(z => new { z, y.arrayPos })))

arrayPos值将指示原始位置。

答案 1 :(得分:1)

假设你在集合中有两个:

var collections = new[]
{
    new[] { new[] { "A" }, new[] { "B", "C" } },
    new[] { new[] { "D" }, new[] { "E", "F" } }
};

var result = from first in collections
             from second in first.Select((x, i) => new {x, i})
             from third in second.x
             group third by second.i;

结果为IEnumerable<IGrouping<int, string>>,这意味着每个成员都是string的集合,其中还有int个密钥。请注意,结果可能未排序,因此1的组可能首先出现。如果您不想这样,请将orderby添加到查询的末尾。

相关问题