Яка різниця між Linq від нащадків XML та елементів


181

Я познайомився з обома цими ключовими словами у VS IntelliSense. Я спробував погуглити різницю між ними і не отримав чіткої відповіді. Який із них має найкращу продуктивність із малими та середніми XML-файлами. Дякую

Відповіді:


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.


Чудова відповідь, я завжди вважав, що вони трохи відстали назад, як підкреслено у вашому описі (коли описуєте Елементи, вам завжди потрібно вживати слово "нащадок", де, як говорити про нащадків, це дещо необов'язково
Mattisdada

16

Descendantsздійснить пошук у всьому піддереві поточного елемента за вказаним іменем (або поверне уплощенную версію дерева, якщо ім'я не вказано), тоді як Elementsшукає лише безпосередніх дітей поточного елемента.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.