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?

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ć.


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


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.