В чем разница между потомками Linq и XML и элементами

181

Я сталкивался с обоими этими ключевыми словами в VS IntelliSense. Я попытался найти разницу между ними и не получил четкого ответа. Какие из них имеют лучшую производительность для небольших и средних файлов XML. Спасибо

Luke101
источник

Ответы:

292

Elementsнаходит только те элементы, которые являются прямыми потомками, то есть непосредственными детьми.

Descendants находит детей на любом уровне, то есть детей, внуков и т. д.


Вот пример, демонстрирующий разницу:

<?xml version="1.0" encoding="utf-8" ?>
<foo>
    <bar>Test 1</bar>
    <baz>
        <bar>Test 2</bar>
    </baz>
    <bar>Test 3</bar>
</foo>

Код:

XDocument doc = XDocument.Load("input.xml");
XElement root = doc.Root;

foreach (XElement e in root.Elements("bar"))
{
    Console.WriteLine("Elements : " + e.Value);
}

foreach (XElement e in root.Descendants("bar"))
{
    Console.WriteLine("Descendants : " + e.Value);
}

Результат:

Элементы: Тест 1
Элементы: Тест 3
Потомки: тест 1
Потомки: тест 2
Потомки: тест 3

Если вы знаете, что элементы, которые вы хотите, являются непосредственными дочерними элементами, вы получите лучшую производительность, если будете использовать Elementsвместо Descendants.

Марк Байерс
источник
Отличный ответ, я всегда думал, что эти два были немного задом наперед, как подчеркивалось в вашем описании (при описании элементов вам всегда нужно использовать слово «потомок», где это немного более необязательно, когда речь идет о потомках
Маттисдада
16

Descendantsбудет искать указанное поддельное имя во всем поддереве текущего элемента (или вернет плоскую версию дерева, если имя не указано), тогда как будет Elementsискать только непосредственные дочерние элементы текущего элемента.

Адам Робинсон
источник