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

これはどのように正確にグループ化したいですか?あなたのタイトルはあなたの質問の本文に対応していないようです。最初のアイテムを1つのコレクションに入れ、2番目のアイテムを別のコレクションに入れたいと思うようです。 –

+0

はい、うまくいくでしょう。 –

+0

「IEnumerable 」とは何ですか?あなたは私たちにIEnumerableの内容を示していますか?これらの2つの別々のインスタンスは '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

@Nikos、生成されたILは、この場合、それについて多くのことを教えてくれません。ほとんどの場合、拡張メソッドへの呼び出しが多く見られます。その実装はパフォーマンスにとって重要です。 – svick

1

あなたは、コレクション内の2つ持っていると仮定すると:。。。

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

これは素晴らしい解決策ですが、それは2つ以上のコレクションになる可能性があります。 –

+0

これは2つ以上のコレクションで機能します。 – svick

+0

それを試してください。しばらく時間がかかります。 –

関連する問題