Quelle est la différence entre Directory.EnumerateFiles et Directory.GetFiles?

146

Quelle est la différence entre Directory.EnumerateFilesvs GetFiles?

De toute évidence, l'un retourne un tableau et l'autre renvoie Enumerable.

Rien d'autre?

Dark Vador
la source

Réponses:

173

À partir de la documentation :

Les méthodes EnumerateFiles et GetFiles diffèrent comme suit: Lorsque vous utilisez EnumerateFiles, vous pouvez commencer à énumérer la collection de noms avant que la collection entière soit renvoyée; lorsque vous utilisez GetFiles, vous devez attendre que tout le tableau de noms soit renvoyé avant de pouvoir accéder au tableau. Par conséquent, lorsque vous travaillez avec de nombreux fichiers et répertoires, EnumerateFiles peut être plus efficace.

Donc, fondamentalement, EnumerateFilesretourne un IEnumerablequi peut être évalué paresseusement, tandis que GetFilesrenvoie un string[]qui doit être entièrement rempli avant de pouvoir revenir.

Daniel DiPaolo
la source
5
L'évaluation paresseuse peut ne pas être totalement gratuite - par exemple si vous le remettez dans un tableau à la fin (j'ai vu ça!). Lazy est efficace lorsque "yagni" -all: vous n'aurez pas besoin de tous les éléments, et arrêtez simplement d'itérer après quelques-uns.
Tomasz Gandor
5
L'énumération paresseuse est également intéressante si vous comptez énumérer une collection si grande que la construction de toute la collection en premier en mémoire est trop lourde. Vous pouvez simplement traiter les articles au fur et à mesure qu'ils viennent et les oublier.
Stéphane Gourichon
1
@TomaszGandor: Ou quand il n'est pas nécessaire de stocker tous les noms de fichiers, par exemple lorsque vous renommez simplement des fichiers.
Sebastian Mach
J'ai regardé dans les sources et constaté que les deux méthodes utilisent interne FileSystemEnumerableFactory.CreateFileInfoIterator(). Mais EnumerateFiles()retourne cet itérateur directement pendant qu'il GetFiles()construit un supplément Listet appelle ToArray(). Donc, si vous vous souciez de la vitesse, il est logique d'utiliser EnumerateFiles()et de gérer vous-même l'itérateur.
C0DEF52
32

EnumerateFilesrenvoie IEnumerable<string>et cela implique une exécution différée. Il n'est disponible que dans Fx4 et plus.

Henk Holterman
la source
2
que signifie Fx4?
Minh Nguyen
3
.net FrameWork 4
Henk Holterman
11
C'est un nom inhabituel pour .NET 4.0
Snak
16

Lorsque vous utilisez EnumerateFiles, toute vitesse est perdue si vous utilisez ensuite .Last. Cela a du sens bien sûr, car pour accéder au dernier fichier, il devra énumérer tous les fichiers, puis récupérer le dernier.

Cependant, utiliser .Firstou .FirstOrDefaultdevient très rapide, car il saisit simplement le premier élément et passe à autre chose.

Skotte
la source
6
Cette très vieille question demandait quelles différences il y avait en dehors de l' aspect Arrayvs. EnumerableVotre réponse est générique pour toutes ces situations mais ne répond pas à la question posée.
Ashigore
2
Le fait est que EnumerateFiles vous permet de commencer à accéder aux données plus rapidement, dans certains cas.
Skotte
16
Le fait est que c'est très utile comme commentaire, mais cela ne répond pas à la question. Il y a une distinction.
djv