Apa perbedaan antara Directory.EnumerateFiles vs Directory.GetFiles?

145

Apa perbedaan antara Directory.EnumerateFilesvs GetFiles?

Jelas satu mengembalikan array dan yang lainnya mengembalikan Enumerable.

Ada yang lain?

DarthVader
sumber

Jawaban:

173

Dari dokumen :

Metode EnumerateFiles dan GetFiles berbeda sebagai berikut: Ketika Anda menggunakan EnumerateFiles, Anda bisa mulai menghitung kumpulan nama sebelum seluruh koleksi dikembalikan; ketika Anda menggunakan GetFiles, Anda harus menunggu seluruh array nama dikembalikan sebelum Anda dapat mengakses array. Oleh karena itu, ketika Anda bekerja dengan banyak file dan direktori, EnumerateFiles dapat lebih efisien.

Jadi pada dasarnya, EnumerateFilesmengembalikan IEnumerableyang dapat dievaluasi agak malas, sedangkan GetFilesmengembalikan string[]yang harus diisi penuh sebelum dapat kembali.

Daniel DiPaolo
sumber
5
Evaluasi malas mungkin tidak sepenuhnya gratis - misalnya jika Anda akan mengembalikannya ke array pada akhirnya (saya melihat itu!). Malas efisien ketika "yagni" -semua: Anda tidak akan membutuhkan semua elemen, dan berhenti iterasi setelah beberapa.
Tomasz Gandor
5
Enumerasi malas juga menarik jika Anda akan menghitung koleksi yang sangat besar sehingga membangun seluruh koleksi pertama di memori terlalu berat. Anda bisa memproses barang saat mereka datang dan melupakannya.
Stéphane Gourichon
1
@TomaszGandor: Atau ketika tidak perlu menyimpan semua nama file, misalnya saat hanya mengganti nama file.
Sebastian Mach
Saya melihat ke sumber dan menemukan bahwa kedua metode menggunakan internal FileSystemEnumerableFactory.CreateFileInfoIterator(). Tetapi EnumerateFiles()mengembalikan iterator ini secara langsung sementara GetFiles()membangun ekstra Listdari itu dan panggilan ToArray(). Jadi, jika Anda peduli kecepatan, masuk akal untuk menggunakan EnumerateFiles()dan menangani iterator sendiri.
C0DEF52
32

EnumerateFileskembali IEnumerable<string>dan itu menyiratkan eksekusi yang ditangguhkan. Ini hanya tersedia di Fx4 dan lebih tinggi.

Henk Holterman
sumber
2
apa fx4 artinya?
Minh Nguyen
3
.net FrameWork 4
Henk Holterman
11
Itu nama yang tidak biasa untuk .NET 4.0
Snak
16

Saat menggunakan EnumerateFiles, semua kecepatan hilang jika Anda menggunakannya .Last . Ini masuk akal tentu saja, karena untuk sampai ke file terakhir, perlu untuk menghitung semua file, lalu ambil yang terakhir.

Namun, menggunakan .Firstatau .FirstOrDefaultmenjadi sangat cepat, karena hanya mengambil item pertama dan bergerak.

Skotte
sumber
6
Pertanyaan yang sangat lama ini menanyakan perbedaan apa yang ada selain aspek Arrayvs. EnumerableJawaban Anda bersifat umum untuk semua situasi seperti itu tetapi tidak menjawab pertanyaan yang diajukan.
Ashigore
2
Intinya adalah, EnumerateFiles memungkinkan Anda mulai mengakses data lebih cepat, dalam beberapa kasus.
Skotte
16
Intinya, ini sangat berguna sebagai komentar tetapi tidak menjawab pertanyaan. Ada perbedaan.
djv