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?

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.


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


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.