問題
インスタンスのコレクションがありXDocument
ます。各ドキュメントには、異なる値をとることができる繰り返し要素があります。この値でグループ化したいのですが、要素ごとに異なる値を指定できます。
<sampledoc>
<value>a</value>
<value>b</value>
<value>c</value>
</sampledoc>
例
- ドキュメントAの値はa、b、cです。
- ドキュメントBの値はb、c、dです
- ドキュメントCの値はa、bです。
次のようなグループ化が必要です。
- グループa
- ドキュメントA
- ドキュメントC
- グループb
- ドキュメントA
- ドキュメントB
- ドキュメントC
- グループc
- ドキュメントA
- ドキュメントB
- グループd
- ドキュメントB
質問
きっとできるはずなのに、今は木が見えません。
docs.GroupBy...
取る式は単一の値を返す必要があり、各ドキュメントには複数の値を含めることができるため、(私が知る限り)それ自体では機能しません。私の頭は、単一のLINQクエリが可能であるはずだと言っていますが、それが何であるかを理解することはできません。
GroupBy
これは、またはAsLookup
LINQメソッドを使用して実行できますか?これを行う方法はありますか?
誰かが喜んで提供してくれるなら、C#の例をお勧めします。
アップデート
Pavel Minaevからの回答と少しのインスピレーションのおかげで、私はこれを次のように解決しました。
// Collate all the different values
docs.SelectMany(doc => doc.Elements("Value")
.Select(el => el.Value))
// Remove duplicate values
.Distinct()
// Generate a lookup of specific value to all
// documents that contain that value
.ToLookup(v => v, v => docs.Where(doc => doc.Elements("Value")
.Any(el=>el.Value == v)));