Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.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# 使用LINQ检索与自定义属性匹配的SiteMapNode_C#_Xml_Linq_Sitemap_Custom Attributes - Fatal编程技术网

C# 使用LINQ检索与自定义属性匹配的SiteMapNode

C# 使用LINQ检索与自定义属性匹配的SiteMapNode,c#,xml,linq,sitemap,custom-attributes,C#,Xml,Linq,Sitemap,Custom Attributes,我是LINQ的新手。我有一个带有自定义属性的普通站点地图XML文档。这些属性之一是:id 我想使用LINQ检索与自定义属性(id)值匹配的单个节点 等等 我对LINQ的尝试如下所示: private SiteMapNode FindNodeById(SiteMapNodeCollection nodes, int siteMapNodeId) { var pageNode = from SiteMapNode node in nodes.Cast<SiteMapNode>()

我是LINQ的新手。我有一个带有自定义属性的普通站点地图XML文档。这些属性之一是:id

我想使用LINQ检索与自定义属性(id)值匹配的单个节点

等等

我对LINQ的尝试如下所示:

private SiteMapNode FindNodeById(SiteMapNodeCollection nodes, int siteMapNodeId)
{
    var pageNode = from SiteMapNode node in nodes.Cast<SiteMapNode>()
                   where node["id"] == Convert.ToString(siteMapNodeId)
                   select node;

    return (SiteMapNode)pageNode;
}
感谢您的帮助!:)

编辑:我在这里以更清晰的方式重新发布了这个问题:


感谢Stefan让我走上正轨

pageNode
是一个节点序列


您需要调用
First()
以获取序列中的第一项。

pageNode
是一个节点序列


您需要调用
First()
以获取序列中的第一项。

您尝试将
IEnumerable
强制转换为
SiteMapNode
。使用
First
筛选并返回一个节点:

return nodes
  .Cast<SiteMapNode>()
  .First(node => node["id"] == Convert.ToString(siteMapNodeId));
返回节点
.Cast()
.First(node=>node[“id”]==Convert.ToString(siteMapNodeId));

您尝试将
IEnumerable
强制转换为
SiteMapNode
。使用
First
筛选并返回一个节点:

return nodes
  .Cast<SiteMapNode>()
  .First(node => node["id"] == Convert.ToString(siteMapNodeId));
返回节点
.Cast()
.First(node=>node[“id”]==Convert.ToString(siteMapNodeId));

谢谢你的建议。我用您提供的代码替换了FindNodeById方法内部的代码。然而,我现在收到一个InvalidOperationException:序列不包含匹配的元素。事实上,lambda表达式似乎根本没有发挥作用。即使我将其更改为使用一个强类型属性(url或标题),仍然会出现InvalidOperationException错误。有什么想法吗?我已经做了更多的测试,事实上lambda表达式正在工作,除了站点地图XML文件中的强类型属性(url、标题、描述),而不是自定义属性(id、isHeaderItem等)…我开始认为你不能在lambda中使用自定义属性,我很遗憾在网上找不到任何与此相关的内容。这是一个老问题,但如果只希望一个节点匹配
Single
SingleOrDefault
,则会更具体(从而传达正确的含义)另外,请确保您没有重复的ID。谢谢您的建议。我用您提供的代码替换了FindNodeById方法内部的代码。然而,我现在收到一个InvalidOperationException:序列不包含匹配的元素。事实上,lambda表达式似乎根本没有发挥作用。即使我将其更改为使用一个强类型属性(url或标题),仍然会出现InvalidOperationException错误。有什么想法吗?我已经做了更多的测试,事实上lambda表达式正在工作,除了站点地图XML文件中的强类型属性(url、标题、描述),而不是自定义属性(id、isHeaderItem等)…我开始认为你不能在lambda中使用自定义属性,我很遗憾在网上找不到任何与此相关的内容。这是一个老问题,但如果只希望一个节点匹配
Single
SingleOrDefault
,则会更具体(从而传达正确的含义)此外,还要确保您没有重复的ID。
return nodes
  .Cast<SiteMapNode>()
  .First(node => node["id"] == Convert.ToString(siteMapNodeId));