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?

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.


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.


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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.