Jaka jest różnica między Directory.EnumerateFiles a Directory.GetFiles?

145

Jaka jest różnica między Directory.EnumerateFilesvs GetFiles?

Oczywiście jeden zwraca tablicę, a drugi zwraca Enumerable.

Coś jeszcze?

DarthVader
źródło

Odpowiedzi:

173

Z dokumentów :

Metody EnumerateFiles i GetFiles różnią się w następujący sposób: Korzystając z EnumerateFiles, można rozpocząć wyliczanie kolekcji nazw przed zwróceniem całej kolekcji; gdy używasz GetFiles, musisz poczekać, aż cała tablica nazw zostanie zwrócona, zanim uzyskasz dostęp do tablicy. Dlatego podczas pracy z wieloma plikami i katalogami EnumerateFiles może być bardziej wydajne.

Zasadniczo EnumerateFileszwraca wartość, IEnumerablektóra może być nieco leniwie oceniana, podczas gdy GetFileszwraca wartość a, string[]która musi być w pełni wypełniona, zanim będzie mogła powrócić.

Daniel DiPaolo
źródło
5
Leniwa ocena może nie przyjść całkowicie za darmo - na przykład, jeśli w końcu zamierzasz odłożyć ją z powrotem do tablicy (widziałem to!). Lazy jest wydajne, gdy "yagni" -all: nie będziesz potrzebować wszystkich elementów i po prostu przestań iterować po kilku.
Tomasz Gandor
5
Leniwe wyliczanie jest również interesujące, jeśli zamierzasz wyliczyć tak dużą kolekcję, że budowanie całej kolekcji najpierw w pamięci jest zbyt ciężkie. Możesz po prostu przetworzyć otrzymane elementy i zapomnieć o nich.
Stéphane Gourichon
1
@TomaszGandor: Albo gdy nie ma potrzeby przechowywania wszystkich nazw plików, np. Przy zmianie nazwy plików.
Sebastian Mach,
Przejrzałem źródła i stwierdziłem, że obie metody używają wewnętrznego FileSystemEnumerableFactory.CreateFileInfoIterator(). Ale EnumerateFiles()zwraca ten iterator bezpośrednio podczas GetFiles()budowania Listz niego i wywołań ToArray(). Jeśli więc zależy Ci na szybkości, warto używać EnumerateFiles()iteratora i zająć się nim samodzielnie.
C0DEF52
32

EnumerateFileszwraca, IEnumerable<string>a to oznacza odroczone wykonanie. Jest dostępny tylko w Fx4 i nowszych.

Henk Holterman
źródło
2
co oznacza Fx4?
Minh Nguyen
3
.net FrameWork 4
Henk Holterman
11
To niezwykła nazwa dla .NET 4.0
Snak
16

Podczas korzystania z EnumerateFiles cała prędkość jest tracona, jeśli używasz .Last. Ma to oczywiście sens, ponieważ aby dostać się do ostatniego pliku, trzeba będzie wyliczyć wszystkie pliki, a następnie pobrać ostatni.

Jednak użycie .Firstlub .FirstOrDefaultstaje się bardzo szybkie, ponieważ po prostu chwyta pierwszy przedmiot i przechodzi dalej.

Skotte
źródło
6
To bardzo stare pytanie dotyczyło różnic poza aspektem Arrayvs. EnumerableTwoja odpowiedź jest ogólna dla wszystkich takich sytuacji, ale nie odpowiada na zadane pytanie.
Ashigore,
2
Chodzi o to, że EnumerateFiles pozwala w niektórych przypadkach szybciej uzyskać dostęp do danych.
Skotte
16
Chodzi o to, że jest to bardzo przydatne jako komentarz, ale nie odpowiada na pytanie. Jest różnica.
djv