Последовательность не содержит совпадающего элемента. Возвращает сопоставленный пользовательский атрибут SiteMapNode, используя LINQ. - PullRequest
2 голосов
/ 27 января 2012

У меня есть файл Web.sitemap, использующий элементы siteMapNode в XML.Я добавил пользовательские атрибуты для каждого тега.Я пытаюсь извлечь значение пользовательского атрибута id.

. Я хочу найти siteMapNode в SiteMapNodeCollection, который соответствует пользовательскому атрибуту id.Я могу добиться этого, используя цикл 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 лямбда-выражением?

Я ценю любую помощь.

Хороших выходных!

Крейг

1 Ответ

1 голос
/ 27 января 2012

Замените First на FirstOrDefault. Но если происходит сбой, значит, нет элементов, удовлетворяющих условию, поэтому результат будет нулевым.

...