次の方法で共有


LINQ to XML における遅延実行とレイジー評価

クエリと軸の操作は、多くの場合、遅延実行を使用するように実装されています。 このトピックでは、遅延実行の要件と利点、および実装に関する注意点について説明します。

遅延実行

遅延実行とは、具体値が実際に必要となるまで、式の評価を遅らせることを意味します。 大きなデータ コレクションの操作が必要な場合、特に連結されたクエリや操作が含まれているプログラムでは、遅延実行によってパフォーマンスが大幅に向上することがあります。 最も効果的なケースでは、遅延実行を使用することによって、ソース コレクションの繰り返し処理を 1 度行うだけで済むようになります。

LINQ テクノロジでは、コア System.Linq クラスのメンバーにおいても、System.Xml.Linq.Extensions などのさまざまな LINQ 名前空間の拡張メソッドにおいても、遅延実行が広く利用されています。

C# 言語では、反復子ブロック内で yield キーワード (yield-return ステートメントの形式) を使用することにより、遅延実行が直接サポートされます。 このような反復子は IEnumerator 型または IEnumerator<T> 型 (または派生型) のコレクションを返します。 Visual Basic 9.0 には、yield キーワードに相当するものがありません。このため、この言語での遅延実行の実装はより複雑になります。

集中評価とレイジー評価

遅延実行を実装するメソッドを記述するときは、レイジー評価と集中評価のどちらを使用してメソッドを実装するかについても決定する必要があります。

  • レイジー評価では、反復子を呼び出すたびに、ソース コレクションの 1 つの要素が処理されます。 これが、一般的な反復子の実装方法です。

  • 集中評価では、反復子への最初の呼び出しの結果として、コレクション全体が処理されます。 ソース コレクションの一時的なコピーが必要になる場合もあります。 たとえば OrderBy メソッドでは、最初の要素を返す前に、コレクション全体を並べ替える必要があります。

通常は、レイジー評価を使用するとパフォーマンスが向上します。コレクション評価時のオーバーヘッド処理が均等に分散され、一時データの使用が最小限に抑えられるためです。 もちろん、操作によっては、中間結果を具体化するより他に方法がない場合もあります。

次の手順

このチュートリアルの次のトピックでは、遅延実行について説明します。

参照

参照

yield (C# リファレンス)

概念

チュートリアル : クエリの連結

概念と用語 (関数型変換)

集計操作