web-dev-qa-db-ja.com

Linq to XMLの子孫と要素の違いは何ですか

VS IntelliSenseでこれらの両方のキーワードに出会いました。私はそれらの違いをググってみましたが、明確な答えが得られませんでした。これらのどれが、小規模から中規模のXMLファイルで最高のパフォーマンスを発揮します。ありがとう

173
Luke101

Elements は、direct子孫、つまり直接の子である要素のみを検索します。

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を使用すると、パフォーマンスが向上します。

280
Mark Byers

Descendantsは、指定された名前の現在の要素のサブツリー全体を検索します(または、名前が指定されていない場合はツリーのフラット化されたバージョンを返します)が、Elementsは現在の要素の直接の子のみを検索します。

16
Adam Robinson