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