我如何将这些XDocuments分组?

问题

我有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#,我希望使用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)));

解决方法:

无论如何,GroupBy不会对您有帮助,因为它会将序列中的每个元素仅分配给一个组.

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))
   });
上一篇:summarise() regrouping output 警告


下一篇:IMO 2021 第 1 题拓展问题的两个极值的编程求解