Чим відрізняється Directory.EnumerateFiles від Directory.GetFiles?


145

Яка різниця між Directory.EnumerateFilesvs GetFiles?

Очевидно, один повертає масив, а інший повертає Численні.

Щось іще?

Відповіді:


173

З документів :

Методи EnumerateFiles та GetFiles відрізняються наступним чином: коли ви використовуєте EnumerateFiles, ви можете почати перераховувати колекцію імен до повернення всієї колекції; під час використання GetFiles, ви повинні дочекатися повернення всього масиву імен, перш ніж ви зможете отримати доступ до масиву. Тому, коли ви працюєте з багатьма файлами та каталогами, EnumerateFiles може бути більш ефективним.

Таким чином, EnumerateFilesповернення, IEnumerableяке можна дещо оцінити ліниво, тоді як GetFilesповернення a string[]має бути повністю заповнене, перш ніж воно може повернутися.


5
Ледача оцінка може виявитися не абсолютно безкоштовною - наприклад, якщо ви повернете її до масиву врешті-решт (я це бачив!). Ледачий є ефективним, коли "ягні" - все: вам не знадобляться всі елементи, а просто зупиняйте ітерацію через кілька.
Томаш Гандор

5
Ледаче перерахування також цікаве, якщо ви збираєтеся перерахувати настільки велику колекцію, що спочатку скласти всю колекцію в пам'яті занадто важко. Ви можете просто обробити предмети по мірі їх приходу та забути.
Стефан Гурішон

1
@TomaszGandor: Або коли немає необхідності зберігати всі імена файлів, наприклад, лише під час перейменування файлів.
Себастьян Мах

Я заглянув у джерела і виявив, що обидва методи використовують внутрішні FileSystemEnumerableFactory.CreateFileInfoIterator(). Але EnumerateFiles()повертає цей ітератор безпосередньо, GetFiles()будуючи додатково Listз нього та дзвінки ToArray(). Тож, якщо ви дбаєте про швидкість, має сенс користуватися EnumerateFiles()ітерапевтом самостійно.
C0DEF52


16

Під час використання EnumerateFiles вся швидкість втрачається, якщо ви потім користуєтесь .Last. Це має сенс, звичайно, тому що, щоб дістатися до останнього файлу, йому потрібно буде перерахувати всі файли, а потім схопити останній.

Однак використання .Firstабо .FirstOrDefaultстає дуже швидким, тому що він просто хапає перший предмет і рухається далі.


6
Це дуже старе питання задало, які відмінності існували крім аспекту Arrayvs. EnumerableВаша відповідь є загальною для всіх таких ситуацій, але не відповідає на поставлене запитання.
Асігоре

2
Справа в тому, що EnumerateFiles дозволяє у деяких випадках почати швидше отримувати доступ до даних.
Скотт

16
Справа в тому, що це дуже корисно як коментар, але це не дає відповіді на питання. Існує відмінність.
dvv
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.