¿Cuál es la diferencia entre los elementos y los descendientes de Linq a XML?

181

He encontrado estas dos palabras clave en VS IntelliSense. Traté de buscar en Google la diferencia entre ellos y no obtuve una respuesta clara. ¿Cuál de estos tiene el mejor rendimiento con archivos XML pequeños a medianos? Gracias

Lucas101
fuente

Respuestas:

292

Elementsencuentra solo aquellos elementos que son descendientes directos , es decir, hijos inmediatos.

Descendants encuentra niños en cualquier nivel, es decir, hijos, nietos, etc.


Aquí hay un ejemplo que demuestra la diferencia:

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

Código:

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

Resultado:

Elementos: Prueba 1
Elementos: Prueba 3
Descendientes: Prueba 1
Descendientes: Prueba 2
Descendientes: Prueba 3

Si sabe que los elementos que desea son elementos secundarios inmediatos, obtendrá un mejor rendimiento si lo utiliza en Elementslugar de hacerlo Descendants.

Mark Byers
fuente
Gran respuesta, siempre pensé que los dos estaban un poco al revés como se destaca en su descripción (al describir Elementos, siempre debe usar la palabra "descendiente", ya que es un poco más opcional cuando se habla de Descendientes
Mattisdada
16

Descendantsbuscará en el subárbol completo del elemento actual el nombre especificado (o devolverá una versión aplanada del árbol si no se proporciona ningún nombre), mientras que Elementssolo buscará los elementos secundarios inmediatos del elemento actual.

Adam Robinson
fuente