C # Как использовать Linq для коллекции XmlAttributeCollection в другом операторе Linq? - PullRequest
0 голосов
/ 06 июля 2018

У меня есть элемент XML с подэлементами, например, так:

<Groups>
    <Group1 name="first" value="1" />
    <Group2 value="2" name="second" />
    <Group3 value="3" />
</Groups>

Я использую уже существующий метод MyMethod(), чтобы получить элемент Groups, который возвращает объект XmlNodeList, который я бросилдо XmlNode.После этого я хочу использовать оператор Linq для выборки только тех групп, в которых есть атрибут name, и сохранять эти имена в списке строк.

В приведенном ниже фрагменте кода я пытаюсь проверитьесли имя первого атрибута узла XML равно "name", но возможно, что атрибут "name" не всегда является первым.Не могли бы вы помочь мне здесь и рассказать, как использовать другое утверждение Linq для свойства Attributes ниже?Attributes свойство имеет тип XmlAttributeCollection .

List<string> result = MyMethod().Cast<XmlNode>()
    .Where(node => node.Attributes[0].Name == "name")
    .Select(node => node.Attributes[0].Value).ToList();

РЕДАКТИРОВАТЬ: мне удалось найти решение, используя встроенный метод GetNamedItem:

List<string> result = MyMethod().Cast<XmlNode>()
    .Where(node => node.Attributes?.GetNamedItem("name") != null)
    .Select(node => node.Attributes?.GetNamedItem("name").Value).ToList();

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

Ключевым методом для вашего вопроса является метод расширения .SelectMany, который возвращает уплощенную коллекцию из коллекции коллекций.

В качестве альтернативы вы можете использовать LINQ to XML (звучит как правильный инструмент для работы;))

var document = XDocument.Load("pathToXmlFile");

// Here you can use more complex logic of "MyMehthod" 
var allGroups = document.Descendants("Groups");

var names = allGroups.SelectMany(groups => groups.Elements())
                     .Where(group => group.Attribute("name"))
                     .Where(attribute => attribute != null)
                     .Select(attribute => attribute.Value)
                     .ToList();
0 голосов
/ 06 июля 2018

Что вы думаете об этом:

List<string> result = MyMethod().Cast<XmlNode>()
    .SelectMany(node => node.Attributes).Where(a => a.Name == "name");

Если ваша цель состоит в том, чтобы получить объект с конкретным именем, полный код становится:

List<string> result = MyMethod().Cast<XmlNode>()
        .SelectMany(node => node.Attributes).Where(a => a.Name == "name")
        .Select(a=> a.Value).ToList();
...