2011-08-05 40 views
0

我有以下内容(可能是两个以上):LINQ,分组上的IEnumerable <object[]>

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

我想将它们分组如下:

“A”, “d”

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

什么是最优化的方式(或至少是一个很好的方法)?

是否有可能存储,不知何故,这第一对“d”(和上第二对E”和‘F’)并没有在同一阵列中开头?

+1

你想如何分组?你问题标题似乎不符合你的问题主体。看起来你想把第一个项目放入一个集合,第二个项目放入另一个集合。 –

+0

是的,这将工作。 –

+0

究竟是什么'IEnumerable '?你告诉我们IEnumerable的内容是什么?这两个'IEnumerable '的单独实例?你能否一下子澄清这个问题,而不是让我不得不要求澄清。 –

回答

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值将指示原来的位置

+0

尝试一下。将需要一段时间。 –

+0

作品! :)我不知道这是否是最佳方式,我在LINQPad上调查生成的IL。谢谢! :) –

+1

@尼科斯,在这种情况下,生成的IL不会告诉你很多。您将会看到大多数对扩展方法的调用,并且它们的实现对于性能很重要。 – svick

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添加到查询的末尾。

+0

这是一个很好的解决方案,但它可能是两个以上的集合。 –

+0

这适用于两个以上的收藏。 – svick

+0

尝试一下。将需要一段时间。 –

相关问题