Qual è la differenza tra Directory.EnumerateFiles vs Directory.GetFiles?


145

Qual'è la differenza tra Directory.EnumerateFilesvs GetFiles?

Ovviamente uno restituisce un array e l'altro restituisce Enumerable.

Qualunque altra cosa?

Risposte:


173

Dai documenti :

I metodi EnumerateFiles e GetFiles differiscono come segue: Quando si utilizza EnumerateFiles, è possibile iniziare a enumerare la raccolta di nomi prima che venga restituita l'intera raccolta; quando si utilizzano GetFiles, è necessario attendere la restituzione dell'intero array di nomi prima di poter accedere all'array. Pertanto, quando si lavora con molti file e directory, EnumerateFiles può essere più efficiente.

Quindi, in sostanza, EnumerateFilesrestituisce un valore IEnumerableche può essere valutato pigramente, mentre GetFilesrestituisce un valore string[]che deve essere completamente popolato prima di poter tornare.


5
La valutazione pigra potrebbe non essere completamente gratuita, ad esempio se alla fine lo riporterai in un array (l'ho visto!). Lazy è efficace quando "yagni" -tutti: non avrai bisogno di tutti gli elementi e smetti di iterare dopo alcuni.
— Tomasz Gandor,

5
L'enumerazione pigra è interessante anche se hai intenzione di enumerare una raccolta così grande che la costruzione dell'intera collezione per prima nella memoria è troppo pesante. Puoi semplicemente elaborare gli elementi man mano che arrivano e dimenticarli.
— Stéphane Gourichon,

1
@TomaszGandor: O quando non è necessario archiviare tutti i nomi di file, ad esempio quando si rinomina un file.
— Sebastian Mach,

Ho esaminato le fonti e ho scoperto che entrambi i metodi utilizzano interni FileSystemEnumerableFactory.CreateFileInfoIterator(). Ma EnumerateFiles()restituisce questo iteratore direttamente mentre ne GetFiles()ricava un extra Liste chiama ToArray(). Quindi, se ti preoccupi della velocità, ha senso usare EnumerateFiles()e gestire l'iteratore da solo.
— C0DEF52,


16

Quando si utilizzano EnumerateFiles, tutta la velocità si perde se si utilizza quindi .Last. Questo ha ovviamente senso, perché per arrivare all'ultimo file, sarà necessario enumerare tutti i file, quindi prendere l'ultimo.

Tuttavia, l'utilizzo .Firsto .FirstOrDefaultdiventa molto veloce, perché prende semplicemente il primo oggetto e va avanti.


6
Questa domanda molto vecchia chiedeva quali differenze ci fossero a parte l' aspetto Arrayvs. EnumerableLa tua risposta è generica per tutte queste situazioni ma non risponde alla domanda posta.
— Ashigore,

2
Il punto è che EnumerateFiles ti consente di iniziare ad accedere ai dati più rapidamente, in alcuni casi.
— Skotte

16
Il punto è che questo è molto utile come commento ma non risponde alla domanda. C'è una distinzione.
— djv,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.