Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 需要帮助理解一些代码示例吗?_C#_Linq_Linq To Xml_Anonymous Types - Fatal编程技术网

C# 需要帮助理解一些代码示例吗?

C# 需要帮助理解一些代码示例吗?,c#,linq,linq-to-xml,anonymous-types,C#,Linq,Linq To Xml,Anonymous Types,最近,在这个论坛上浏览最近的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=> n

最近,在这个论坛上浏览最近的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发布)

Select方法有一个重载,允许您使用索引


选择方法有一个重载,允许您使用索引


让我们通过将查询分为两部分来理解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”作为索引(i只是一个迭代器)

让我们通过将查询分为两部分来理解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”作为索引(i只是一个迭代器)

您有正在使用的XML吗?这可能有助于我们更好地解释它way@G_S我已经更新了问题并添加了与OP帖子相同的链接…这是一个嵌套字典:Dictionary@jdweng你能详细解释一下吗?看看迈克尔的回答。我会更改代码。如果失败,请尝试以下操作:.GroupBy(x=>(string)x.Parent)您有正在使用的XML吗?这可能有助于我们更好地解释它way@G_S我已经更新了问题并添加了与OP帖子相同的链接…这是一个嵌套字典:Dictionary@jdweng你能详细解释一下吗?看看迈克尔的回答。我会更改代码。如果失败,请尝试以下操作:.GroupBy(x=>(字符串)x.Parent)