Directory.EnumerateFiles vs Directory.GetFiles arasındaki fark nedir?


146

Directory.EnumerateFilesVs arasındaki fark nedir GetFiles?

Açıkçası biri bir dizi döndürür ve diğeri Enumerable döndürür.

Başka herhangi bir şey?

Yanıtlar:


173

Gönderen docs :

EnumerateFiles ve GetFiles yöntemleri aşağıdaki gibi farklılık gösterir: EnumerateFiles kullandığınızda, tüm koleksiyon döndürülmeden önce ad koleksiyonunu numaralandırmaya başlayabilirsiniz; GetFiles kullandığınızda, diziye erişebilmek için tüm ad dizisinin döndürülmesini beklemeniz gerekir. Bu nedenle, birçok dosya ve dizinle çalışırken, EnumerateFiles daha verimli olabilir.

Temel olarak, EnumerateFilesbir IEnumerableşekilde tembel olarak değerlendirilebilen GetFilesbir dönerken geri dönmeden string[]önce tam olarak doldurulması gereken bir döner döndürür .


5
Tembel değerlendirme tamamen ücretsiz olmayabilir - örneğin sonunda bir diziye geri koyacaksanız (bunu gördüm!). Tembel "yagni" -tüm etkilidir -tüm: tüm elemanlara ihtiyacınız olmayacak ve sadece birkaç sonra tekrarlamayı durdurun.
Tomasz Gandor

5
Tembel numaralandırma, o kadar büyük bir koleksiyon numaralandıracaksanız, tüm koleksiyonu ilk önce hafızada inşa etmek çok ağırsa ilginçtir. Öğeleri geldikçe işleyebilir ve unutabilirsiniz.
Stéphane Gourichon

1
@TomaszGandor: Veya tüm dosya adlarını depolamaya gerek olmadığında, örneğin dosyaları yeniden adlandırırken.
Sebastian Mach

Kaynaklara baktım ve her iki yöntemin de içsel kullandığını gördüm FileSystemEnumerableFactory.CreateFileInfoIterator(). Ama EnumerateFiles()ederken doğrudan bu yineleyici döndürür GetFiles()ekstra kurar Listo ve aramalardan ToArray(). Bu nedenle, hızla EnumerateFiles()ilgileniyorsanız, yineleyiciyi kendiniz kullanmak ve başa çıkmak mantıklıdır .
C0DEF52


16

EnumerateFiles kullanırken, o zaman kullanıyorsanız tüm hız kaybedilir .Last. Bu elbette mantıklı, çünkü son dosyaya ulaşmak için tüm dosyaları numaralandırmalı, ardından son dosyayı alması gerekecek.

Ancak, .Firstveya kullanımı .FirstOrDefaultçok hızlı olur, çünkü sadece ilk öğeyi alır ve devam eder.


6
Bu çok eski soru, Arrayvs Enumerableyönü dışında hangi farklılıkların olduğunu sordu . Cevabınız tüm bu durumlar için geneldir ancak sorulan soruya cevap vermez.
Ashigore

2
Mesele şu ki, EnumerateFiles bazı durumlarda verilere daha hızlı erişmenizi sağlar.
Skotte

16
Mesele şu ki, bu bir yorum olarak çok faydalıdır ama soruyu cevaplamamaktadır. Bir ayrım var.
djv
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.