如何对这些XDocuments进行分组?

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查询,但它无法理解它会是什么。

是否可以使用GroupByAsLookup 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)));
1个回答

3

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))
   });

谢谢。我很快就意识到了GroupBy的问题,但是一直在苦苦挣扎。我刚刚想出了与您查询的第一部分完全相同的内容,但是第二部分一直很难实现,因为我一直试图让整个IGrouping工作起来。也许我可以在您的Select调用中创建一个ILookup。 - Jeff Yates

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接