3

問題

インスタンスのコレクションがあり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これは、またはAsLookupLINQメソッドを使用して実行できますか?これを行う方法はありますか?

誰かが喜んで提供してくれるなら、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)));
4

1 に答える 1

3

GroupByシーケンス内のすべての要素が1つのグループにのみ割り当てられるため、ここでは役に立ちません。

var docs = new XDocument[] { docA, docB, docC } ;
var result = docs
   .SelectMany(doc => doc.Root.Elements("Value"))
   .Select(el => el.Value)
   .Distinct()
   .Select(key => new {
        Key = key,
        Documents = docs.Where(doc =>
            doc.Root.Elements("Value").Any(el => el.Value == key))
   });
于 2009-07-24T18:56:59.363 に答える