1. ホーム
  2. c#

[解決済み] ToList()を呼び出すと、パフォーマンスに影響がありますか?

2022-05-12 01:22:06

質問

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

あるディレクトリからファイルを取得する、というクエリを書いていました。

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

しかし、私が好きなのは List<> を入れることにしました。

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

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

どのように解決するのですか?

IEnumerable.ToList()

はい。 IEnumerable<T>.ToList() はパフォーマンスに影響を及ぼしますが、それは O(n) の操作は、パフォーマンスが重要な操作でのみ注意が必要でしょう。

その ToList() の操作では List(IEnumerable<T> collection) コンストラクタを使用します。このコンストラクタは配列のコピーを作成しなければなりません(より一般的には IEnumerable<T> そうしないと、将来的に元の配列に変更を加えたときに、ソースである T[] も、一般的には好ましくないでしょう。

メモリのチャンクをコピーするのは非常に高速な操作です。

便利なヒント AsTo

LINQの中には、以下のように As (例えば AsEnumerable() ) と To など ToList() ). で始まるメソッドは To で始まるメソッドは上記のような変換が必要であり(つまり、パフォーマンスに影響を与える可能性がある)。 As のように、キャストや簡単な操作で済みます。

の詳細 List<T>

以下、もう少し詳しく説明します。 List<T> が動作します。)

A List<T> このリサイズイベントは、古い配列の内容を新しい配列にコピーします。そのため、最初は小さく、そして 必要であれば、サイズを大きくする .

との違いです。 Capacity Count 属性は List<T> . Capacity は、裏側の配列の大きさを指しています。 Count の項目数です。 List<T> であり、常に <= Capacity . そのため、リストに項目が追加された場合、それを増やすことで過去の Capacity のサイズが小さくなる。 List<T> が2倍になり、配列がコピーされます。