Quelle est la différence entre les descendants et les éléments Linq to XML

182

J'ai rencontré ces deux mots-clés dans VS IntelliSense. J'ai essayé de googler la différence entre eux et je n'ai pas obtenu de réponse claire. Lequel d'entre eux a les meilleures performances avec des fichiers XML petits à moyens. Merci

Luc101
la source

Réponses:

293

Elementsne trouve que les éléments qui sont des descendants directs , c'est-à-dire des enfants immédiats.

Descendants trouve des enfants à tous les niveaux, c'est-à-dire des enfants, des petits-enfants, etc.


Voici un exemple démontrant la différence:

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

Code:

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);
}

Résultat:

Éléments: Test 1
Éléments: Test 3
Descendants: Test 1
Descendants: Test 2
Descendants: Test 3

Si vous savez que les éléments souhaités sont des enfants immédiats, vous obtiendrez de meilleures performances si vous les utilisez à la Elementsplace de Descendants.

Mark Byers
la source
Excellente réponse, j'ai toujours pensé que les deux étaient un peu en arrière comme souligné dans votre description (lorsque vous décrivez des éléments, vous devez toujours utiliser le mot «descendant», car il est un peu plus facultatif lorsque vous parlez de Descendants
Mattisdada
17

Descendantsrecherchera le nom spécifié dans tout le sous-arbre de l'élément courant (ou retournera une version aplatie de l'arborescence si aucun nom n'est fourni), tandis que Elementsne recherche que les enfants immédiats de l'élément courant.

Adam Robinson
la source