【问题标题】:Sequence contains no matching element - Return SiteMapNode matching custom attribute using LINQ序列不包含匹配元素 - 使用 LINQ 返回匹配自定义属性的 SiteMapNode
【发布时间】:2012-01-27 15:48:27
【问题描述】:

我有一个使用 XML 中的 siteMapNode 元素的 Web.sitemap 文件。我为每个标签添加了自定义属性。我正在尝试提取自定义属性id 的值。

我想在SiteMapNodeCollection 中找到一个与自定义属性id 匹配的siteMapNode。我可以使用foreach 循环来实现这一点,但我想使用 LINQ 让它变得简短而甜蜜。

--不起作用-- 函数如下:

private SiteMapNode FindNodeById(SiteMapNodeCollection nodes, int siteMapNodeId)
{
    return nodes
            .Cast<SiteMapNode>()
            .First(node => node["id"] == Convert.ToString(siteMapNodeId));
}

但是,我收到 InvalidOperationException => Sequence contains no matching element。如果我从自定义属性切换到默认的 .NET 属性,例如 URL(或标题),我可以毫无问题地恢复节点。 例如,对于 title 属性设置为“测试”的节点,此语句不会出现问题:

--工作--

    private SiteMapNode FindNodeById(SiteMapNodeCollection nodes, int siteMapNodeId)
    {
        return nodes
          .Cast<SiteMapNode>()
          .First(node => node.title == "Test");
    }

谁能指出我缺少什么以便自定义属性值在.First lambda 表达式中匹配的正确方向?

感谢您的帮助。

周末愉快!

克雷格

【问题讨论】:

    标签: c# xml linq sitemap custom-attributes


    【解决方案1】:

    将 First 替换为 FirstOrDefault。但是如果它崩溃了,则意味着没有满足条件的元素,因此结果将为null。

    【讨论】:

    • 感谢您的建议。我试过了,我收到了该节点的null。每当我尝试使用自定义属性时,都不会返回节点。 LINQ 似乎只适用于 siteMapNode 元素的强类型属性。
    • 但是你说它在 foreach 循环中工作。你为什么不能机械地将它重写为 linq 查询?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-23
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多