2012-12-06 18 views
8

拡張メソッドToList()はどのように機能しますか? IEnumerableが10000個あるとします。 ToList()Listを新規作成し、IEnumerable10000個のアイテムを繰り返して、Listを返すか、.NETは何か他の方法でそれを行いますか?IEnumerableのToList()はどのように機能しますか?

このMSDN linkは、DBクエリの即時実行について語ります。私の質問はIEnumerableListに変換することに関するものです。

答えて

22

「最悪の場合」のシナリオではありますが、必ずしも繰り返す必要はありません。基本的にはnew List<T>(source)が呼び出されますが、それはスリーブの上にいくつかのトリックがあります。ソースがICollection<T>を実装する場合、コンストラクタはICollection<T>.CopyTo()を呼び出して配列全体にデータをコピーできます。これは、シングルステッピング反復よりも効率的に実装できます。同様に、ICollection<T>のケースでは、新しいリストは最初の最終的なサイズを知っているので、内部バッファを拡張し続ける必要はありません。

もう少し詳しくは、Edulinq ToList() blog postをご覧ください。

+0

上記のリンクは機能しません。ここでJonの投稿に移動することができます - [Edulinq ToList()ブログ投稿](https://codeblog.jonskeet.uk/2011/01/01/reimplementing-linq-to-objects-part-20-tolist/) – vibhu

+0

@ vibhu:リンクを更新しました。 –

2

.ToList拡張メソッドは、List<T>コンストラクタにIEnumerable<T>を渡します。このコンストラクタはIEnumerable<T>を反復処理し、返されるのと同じ順序でIEnumerable<T>のelemtnsをコピーします。

関連する問題