LINQ to XML后代和元素之间有什么区别?

我在VS智能感知中遇到了这两个关键字。我试着在谷歌上搜索它们之间的区别,但没有得到明确的答案。对于小型到中型的XML文件,其中哪一个具有最佳的性能?谢谢

44029 次浏览

Elements finds only those elements that are direct descendents, i.e. immediate children.

Descendants finds children at any level, i.e. children, grand-children, etc...


Here is an example demonstrating the difference:

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

Result:

Elements : Test 1
Elements : Test 3
Descendants : Test 1
Descendants : Test 2
Descendants : Test 3

If you know that the elements you want are immediate children then you will get better performance if you use Elements instead of Descendants.

Descendants will search the entire subtree of the current element for the specified name (or will return a flattened version of the tree if no name is provided), whereas Elements searches only the immediate children of the current element.