¿Cuál es la diferencia entre Directory.EnumerateFiles y Directory.GetFiles?

145

¿Cuál es la diferencia entre Directory.EnumerateFilesvs GetFiles?

Obviamente, uno devuelve una matriz y el otro devuelve Enumerable.

¿Algo más?

Darth Vader
fuente

Respuestas:

173

De los documentos :

Los métodos EnumerateFiles y GetFiles difieren de la siguiente manera: cuando usa EnumerateFiles, puede comenzar a enumerar la colección de nombres antes de que se devuelva toda la colección; cuando usa GetFiles, debe esperar a que se devuelva toda la matriz de nombres antes de poder acceder a la matriz. Por lo tanto, cuando trabaja con muchos archivos y directorios, EnumerateFiles puede ser más eficiente.

Básicamente, EnumerateFilesdevuelve un IEnumerableque puede evaluarse perezosamente de alguna manera, mientras que GetFilesdevuelve un string[]que debe estar completamente poblado antes de que pueda regresar.

Daniel DiPaolo
fuente
55
Es posible que la evaluación diferida no sea completamente gratuita, por ejemplo, si al final la va a volver a colocar en una matriz (¡lo vi!). Lazy es eficiente cuando "yagni" -todos: no va a necesitar todos los elementos, y simplemente deje de iterar después de algunos.
Tomasz Gandor
55
La enumeración diferida también es interesante si va a enumerar una colección tan grande que construir la colección completa primero en la memoria es demasiado pesada. Puede procesar los elementos a medida que vienen y olvidarlos.
Stéphane Gourichon
1
@TomaszGandor: O cuando no hay necesidad de almacenar todos los nombres de archivo, por ejemplo, cuando solo se cambia el nombre de los archivos.
Sebastian Mach
Miré en las fuentes y descubrí que ambos métodos usan interna FileSystemEnumerableFactory.CreateFileInfoIterator(). Pero EnumerateFiles()devuelve este iterador directamente mientras GetFiles()construye extra Listy llama ToArray(). Por lo tanto, si le importa la velocidad, tiene sentido usar EnumerateFiles()y lidiar con el iterador usted mismo.
C0DEF52
32

EnumerateFilesdevuelve IEnumerable<string>y eso implica ejecución diferida. Solo está disponible en Fx4 y superiores.

Henk Holterman
fuente
2
¿Qué significa Fx4?
Minh Nguyen
3
.net FrameWork 4
Henk Holterman
11
Ese es un nombre inusual para .NET 4.0
Snak
16

Al usar EnumerateFiles, toda la velocidad se pierde si está usando .Last. Esto tiene sentido, por supuesto, porque para llegar al último archivo, tendrá que enumerar todos los archivos y luego tomar el último.

Sin embargo, usar .Firsto se .FirstOrDefaultvuelve muy rápido, porque simplemente toma el primer elemento y sigue adelante.

Skotte
fuente
66
Esta pregunta muy antigua preguntaba qué diferencias había aparte del ArrayvsEnumerable aspectoSu respuesta es genérica para todas esas situaciones, pero no responde la pregunta formulada.
Ashigore
2
El punto es que EnumerateFiles le permite comenzar a acceder a los datos más rápido, en algunos casos.
Skotte
16
El punto es que esto es muy útil como comentario pero no responde la pregunta. Hay una distincion.
djv