Qual é a diferença entre Descendentes e Elementos de Linq para XML

181

Eu encontrei essas duas palavras-chave no VS IntelliSense. Tentei pesquisar a diferença entre eles e não obtive uma resposta clara. Qual deles tem o melhor desempenho com arquivos XML pequenos a médios. obrigado

Luke101
fonte

Respostas:

292

Elementsencontra apenas os elementos que são descendentes diretos , ou seja, filhos imediatos.

Descendants encontra crianças em qualquer nível, ou seja, filhos, netos, etc.


Aqui está um exemplo demonstrando a diferença:

<?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: Teste 1
Elementos: Teste 3
Descendentes: Teste 1
Descendentes: Teste 2
Descendentes: Teste 3

Se você sabe que os elementos que deseja são filhos imediatos, obterá melhor desempenho se usar em Elementsvez de Descendants.

Mark Byers
fonte
Grande resposta, eu sempre pensei que os dois eram um pouco para trás como destaque na sua descrição (ao descrever Elements, você sempre precisa usar a palavra "descendente", onde, uma vez que é um pouco mais opcional quando se fala de descendentes
Mattisdada
16

Descendantsprocurará na subárvore inteira do elemento atual o nome especificado (ou retornará uma versão achatada da árvore se nenhum nome for fornecido), enquanto Elementspesquisa apenas os filhos imediatos do elemento atual.

Adam Robinson
fonte