gpt4 book ai didi

c# - 如何对这些 XDocuments 进行分组?

转载 作者:行者123 更新时间:2023-11-30 16:36:10 24 4
gpt4 key购买 nike

问题

我有一组 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)));

最佳答案

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

关于c# - 如何对这些 XDocuments 进行分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1179434/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com