我有一组XDocument
个实例。每个文档都有一个重复元素,可以采用不同的值。我希望按此值对它们进行分组,但每个元素都可以指定不同的值。
<sampledoc>
<value>a</value>
<value>b</value>
<value>c</value>
</sampledoc>
我想要一个分组:
我确信我必须能够做到这一点,但我现在看不到树木了。
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)));
答案 0 :(得分: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))
});