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


Jaka jest różnica pomiędzy Directory.EnumerateFiles vs GetFiles?

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

Coś jeszcze?


110
2018-04-14 20:59


pochodzenie




Odpowiedzi:


Od doktorzy:

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

Więc w zasadzie EnumerateFiles zwraca wartość IEnumerable które mogą być leniwie wycenione, podczas gdy GetFiles zwraca a string[] który musi być w pełni zaludniony, zanim będzie mógł wrócić.


133
2018-04-14 21:01



Leniwa ewaluacja może nie przyjść całkowicie za darmo - na przykład, jeśli wrócisz do tablicy w końcu (widziałem to!). Lazy jest efektywny, gdy "yagni" - wszystkie: nie będziesz potrzebował wszystkich elementów i po prostu przestaniesz iterować po kilku. - Tomasz Gandor
Leniwe wyliczenie jest również interesujące, jeśli zamierzasz wyliczyć tak dużą kolekcję, że budowanie całej kolekcji w pamięci jest zbyt duże. Możesz po prostu przetworzyć przedmioty, które nadejdą, i zapomnieć o nich. - Stéphane Gourichon
@TomaszGandor: lub gdy nie ma potrzeby przechowywania wszystkich nazw plików, np. kiedy tylko zmieniam nazwy plików. - Sebastian Mach


EnumerateFiles zwraca IEnumerable<string> a to oznacza opóźnione wykonanie. Jest dostępny tylko w Fx4 i wyżej.


28
2018-04-14 21:01



co oznacza Fx4? - Minh Nguyen
.net FrameWork 4 - Henk Holterman


Gdy używasz EnumerateFiles, cała prędkość jest tracona, jeśli używasz .Last. Oczywiście ma to sens, ponieważ aby dostać się do ostatniego pliku, konieczne będzie wyliczenie wszystkich plików, a następnie pobranie ostatniego.

Jednak za pomocą .First lub .FirstOrDefault staje się bardzo szybki, ponieważ po prostu chwyta pierwszy przedmiot i przechodzi dalej.


12
2018-06-11 17:28



To bardzo stare pytanie spytało, jakie różnice istnieją poza tym Array vs Enumerable aspekt. Twoja odpowiedź jest ogólna dla wszystkich takich sytuacji, ale nie odpowiada na zadane pytanie. - Ashigore
Chodzi o to, że EnumerateFiles pozwala w niektórych przypadkach szybciej uzyskać dostęp do danych. - Skotte
Chodzi o to, że jest to bardzo użyteczne jako komentarz, ale nie odpowiada na pytanie. Istnieje rozróżnienie. - djv