¿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?

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.


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


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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.