Qual é a diferença entre Directory.EnumerateFiles vs Directory.GetFiles?


145

Qual é a diferença entre Directory.EnumerateFilesvs GetFiles?

Obviamente, um retorna uma matriz e o outro retorna Enumerable.

Algo mais?

Respostas:


173

Dos documentos :

Os métodos EnumerateFiles e GetFiles diferem da seguinte maneira: Quando você usa EnumerateFiles, pode começar a enumerar a coleção de nomes antes que a coleção inteira seja retornada; ao usar GetFiles, você deve aguardar o retorno de toda a matriz de nomes antes de poder acessar a matriz. Portanto, quando você estiver trabalhando com muitos arquivos e diretórios, EnumerateFiles pode ser mais eficiente.

Então, basicamente, EnumerateFilesretornos IEnumerableque podem ser avaliados de alguma forma preguiçosamente, enquanto GetFilesretornos string[]que precisam ser totalmente preenchidos antes que possam retornar.


5
A avaliação preguiçosa pode não ser totalmente gratuita - por exemplo, se você a colocar de volta em uma matriz no final (eu vi isso!). Preguiçoso é eficiente quando "yagni" -todos: você não precisará de todos os elementos e pára de iterar depois de alguns.
Tomasz Gandor

5
A enumeração lenta também é interessante se você enumerar uma coleção tão grande que criar a coleção inteira primeiro na memória é muito pesado. Você pode apenas processar os itens quando eles vierem e esquecê-los.
Stéphane Gourichon

1
@TomaszGandor: Ou quando não há necessidade de armazenar todos os nomes de arquivos, por exemplo, ao renomear arquivos.
Sebastian Mach

Examinei as fontes e descobri que ambos os métodos usam interno FileSystemEnumerableFactory.CreateFileInfoIterator(). Mas EnumerateFiles()retorna esse iterador diretamente enquanto GetFiles()cria extra Liste chama ToArray(). Portanto, se você se preocupa com a velocidade, faz sentido usar EnumerateFiles()e lidar com o iterador.
C0DEF52


16

Ao usar EnumerateFiles, toda a velocidade será perdida se você estiver usando .Last. Isso faz sentido, é claro, porque para chegar ao último arquivo, ele precisará enumerar todos os arquivos e pegar o último.

No entanto, usar .Firstou .FirstOrDefaultse torna muito rápido, porque simplesmente pega o primeiro item e segue em frente.


6
Esta pergunta muito antiga perguntou quais eram as diferenças além do aspecto Arrayvs. EnumerableSua resposta é genérica para todas essas situações, mas não responde à pergunta.
Ashigore

2
O ponto é que EnumerateFiles permite que você comece a acessar dados mais rapidamente, em alguns casos.
30515 Skotte

16
O ponto é que isso é muito útil como um comentário, mas não responde à pergunta. Há uma distinção.
DJV
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.