最近在浏览这个论坛中最近的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
让我们通过将您的查询分成两部分来理解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'为索引(我只是一个迭代器)
Select方法有一个允许您使用索引的重载