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


145

Directory.EnumerateFilesvs はどう違いGetFilesますか?

明らかに、1つは配列を返し、もう1つはEnumerableを返します。

他に何か?

回答:


173

ドキュメントから:

EnumerateFilesメソッドとGetFilesメソッドは次のように異なります。EnumerateFilesを使用すると、コレクション全体が返される前に、名前のコレクションの列挙を開始できます。GetFilesを使用する場合、配列にアクセスするには、名前の配列全体が返されるまで待つ必要があります。したがって、多くのファイルとディレクトリを使用している場合、EnumerateFilesの方が効率的です。

したがって、基本的に、遅延評価が可能なEnumerateFilesan IEnumerableを返しますが、返す前に完全に入力されている必要があるGetFilesa string[]を返します。


5
遅延評価は完全に無料で提供されない場合があります-たとえば、最後にそれを配列に戻す場合(私はそれを見ました!)。"yagni" -allの場合、Lazyは効率的です。すべての要素が必要になるわけではなく、数回繰り返しただけで停止します。
Tomasz Gandor 2013

5
非常に大きなコレクションを列挙してメモリ全体を最初に構築するのが重すぎる場合にも、遅延列挙は興味深いものです。あなたは彼らが来て、それらを忘れたときにアイテムを処理することができます。
ステフェイン・グーリッホン

1
@TomaszGandor:または、すべてのファイル名を保存する必要がない場合(ファイル名を変更する場合など)。
セバスチャンマッハ

ソースを調べたところ、どちらの方法もinternalを使用していることがわかりましたFileSystemEnumerableFactory.CreateFileInfoIterator()。しかし、EnumerateFiles()このイテレータを直接返し、その間にGetFiles()エクストラを作成Listして呼び出しますToArray()。したがって、速度を重視する場合EnumerateFiles()は、イテレータを使用して自分で処理することが理にかなっています。
C0DEF52


16

EnumerateFilesを使用する場合、を使用すると、すべての速度が失われます.Last。もちろん、これは理にかなっています。最後のファイルに到達するには、すべてのファイルを列挙してから、最後のファイルを取得する必要があるためです。

ただし、.Firstまたはを使用する.FirstOrDefaultと、最初のアイテムを取得して次に進むため、非常に高速になります。


6
この非常に古い質問は、ArrayvsのEnumerable側面とは別に、どのような違いがあるのか​​を尋ねました。あなたの答えはそのようなすべての状況に一般的ですが、尋ねられた質問には答えません。
アシゴレ2014年

2
重要なのは、EnumerateFilesを使用すると、データへのアクセスをより速く開始できる場合があります。
Skotte 2015年

16
重要なのは、これはコメントとしては非常に便利ですが、質問に対する回答にはなりません。違いがあります。
djv
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.