2011-08-05 57 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

嘗試一下。將需要一段時間。 –

相關問題