最近在这个论坛中浏览最近的c#问题/答案时,我偶然发现了一段linq-to-xml代码而不是我无法完全理解,但是喜欢使用linq-to-xml的人却因为我无法解决而烦恼我通过一步一步的方式弄清楚过程究竟在做什么。
以下是代码段
var cons = xdoc.Descendants("xref")
.Where(x=>x.Attribute("rid").Value.Contains("ref"))
.GroupBy(x=>x.Parent)
.Select(grp=> new
{
Parent = grp.Key,
ConsecutiveNodes = grp.Select((n, i)=> new
{
Index = i+1,
Node = n
}),
Count = grp.Count()
})
.ToList();
任何人都可以向我详细解释部分
.Select(grp=> new
{
Parent = grp.Key,
ConsecutiveNodes = grp.Select((n, i)=> new
{
Index = i+1,
Node = n
}),
Count = grp.Count()
})
正在做什么?我从来没有在另一个匿名类型中使用匿名类型,我也没有得到多参数lambda表达式(n,i)=>new...
(除了一个参数是字符而另一个是索引这个简单的东西)?它在这段代码中的作用是什么?
这是文件(由代码的OP发布)xml file
答案 0 :(得分:2)
让我们通过将您的查询分为两部分来理解Linq
第一部分
var cons = xdoc.Descendants("xref")
.Where(x => x.Attribute("rid").Value.Contains("ref"))
.GroupBy(x => x.Parent);
第二部分
var consSelect = cons.Select(grp => new
{
Parent = grp.Key,
ConsecutiveNodes = grp.Select((n, i) => new
{
Index = i + 1,
Node = n
}),
Count = grp.Count()
})
.ToList();
在第一部分中,您将获取所有外部参照并通过其父级对XML进行分组。 无论何时对元素进行分组,分组元素都将被视为键。
因此在第二部分中,grp.key为您提供父元素,count为您提供每个组中的外部参照的数量,连续节点再次是{index,Node}对象的集合,其中包含每个外部参照作为节点和' i'作为索引(我只是一个迭代器)
答案 1 :(得分:1)
Select方法有一个允许你使用索引的重载