ToList() を呼び出すとパフォーマンスに影響がありますか? 質問する

ToList() を呼び出すとパフォーマンスに影響がありますか? 質問する

を使用する場合ToList()、考慮する必要があるパフォーマンスへの影響はありますか?

ディレクトリからファイルを取得するためのクエリを書いていました。次のクエリです。

string[] imageArray = Directory.GetFiles(directory);

しかし、代わりに作業するのが好きなのでList<>、入れることにしました...

List<string> imageList = Directory.GetFiles(directory).ToList();

では、このような変換を行うことを決定する際に考慮すべきパフォーマンスへの影響はあるのでしょうか、それとも大量のファイルを扱う場合にのみ考慮すべきでしょうか? これは無視できる変換でしょうか?

ベストアンサー1

IEnumerable<T>.ToList()

はい、IEnumerable<T>.ToList()パフォーマンスに影響はありますが、の上)ただし、パフォーマンスが重要な操作でのみ注意が必要になる可能性があります。

このToList()操作では、List(IEnumerable<T> collection)コンストラクター。このコンストラクターは配列のコピーを作成する必要があります (より一般的にはIEnumerable<T>)。そうしないと、元の配列の将来の変更によってソースも変更され、T[]一般的には望ましくありません。

繰り返しになりますが、これはリストが非常に大きい場合にのみ違いを生みます。メモリのチャンクをコピーする操作は非常に高速に実行されます。

便利なヒント、AsvsTo

AsLINQには、(例えば)で始まるメソッドがいくつかあることに気づくでしょう。AsEnumerable())およびTo(例えばToList()) で始まるメソッドはTo上記のような変換を必要とします (つまり、パフォーマンスに影響を与える可能性があります)。一方、 で始まるメソッドは変換をAs必要としないため、キャストまたは単純な操作のみが必要になります。

追加の詳細List<T>

List<T>ご興味があれば、仕組みについてもう少し詳しく説明します:)

A List<T> also uses a construct called a dynamic array which needs to be resized on demand, this resize event copies the contents of an old array to the new array. So it starts off small and increases in size if required.

This is the difference between the Capacity and Count properties on List<T>. Capacity refers to the size of the array behind the scenes, Count is the number of items in the List<T> which is always <= Capacity. So when an item is added to the list, increasing it past Capacity, the size of the List<T> is doubled and the array is copied.

おすすめ記事