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.