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