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