6

Directory.GetFilesifDirectory.EnumerateFilesを使用して同じことを行う理由がわかりません。見つかったディレクトリのリスト全体が返される前でも、リストを列挙できます。

Directory.EnumerateFiles と Directory.GetFiles の違いは何ですか?

なぜ、それEnumerateFilesが利用可能になったので、使用する必要があるのでしょうGetFilesか?

4

3 に答える 3

8

適切な仕事には適切なツールを使用します。ファイルの数が少ない場合は、Directory.GetFiles()それらを使用してメモリにロードすることをお勧めします。

Directory.EnumerateFiles()一方、ファイルを 1 つずつ列挙してメモリを節約する必要がある場合です。

これは、すべてを lazyにするか、適切な場合にのみ使用するかという議論に似ています。正当な理由もなくすべてを怠惰にするのはやり過ぎなので、これは物事を大局的に見るのに役立つと思います。

シンプルさと効率のトレードオフがあります。概念的には、実際にはファイルを含まないが、一度に 1 つずつ生成する列挙子は、文字列配列よりも複雑です。その列挙子を に格納できることIEnumerable<string>は素晴らしい抽象化ですが、要点は残ります。

また、パフォーマンスを予測することもより困難になる可能性があります。メソッドが呼び出されると、パフォーマンス コストが発生することGetFiles()がわかります。EnumerateFiles()列挙されるまで何もしません。

意図が重要です。EnumerateFiles()ファイルがそれほど多くないことがわかっているディレクトリで使用している場合は、理解せずに盲目的に使用しているだけです。コードが実行されるコンピューターも重要です。24 GB の RAM を搭載したサーバーで何かを実行している場合GetFiles()、1 GB の RAM を搭載したサーバーで実行している場合よりも、メモリを大量に消費する方法を使用する可能性が高くなります。

ファイルの数がわからない場合、またはコードが実行される環境の種類がわからない場合は、注意を怠ってメモリ効率の良いバージョンを使用することをお勧めします。

考慮すべき多くの変数があり、優れたプログラマーはこれらのことを考慮に入れ、意図的に物事を行います。

于 2014-07-04T03:45:13.653 に答える
4

これら 2 つのメソッドはどちらも、最終的に System.IO.FileSystemEnumerableFactory.CreateFileNameIterator() を呼び出します。唯一の違いは、GetFiles() の結果が List にラップされてから配列に変換されることです。したがって、他のいくつかの回答で述べたように、違いは、列挙子が GetFiles() と EnumerateFiles を介して既に走査されていることです。これにより、列挙子を走査する前に列挙子が得られます。

参考までに、ILSpy ( http://ilspy.net/ )を使用してこれを見つけることができました。

于 2014-07-04T03:34:47.957 に答える