Directory.EnumerateFiles与Directory.GetFiles有什么区别?

Dar*_*der 132 .net c# directory io

Directory.EnumerateFilesvs 之间有什么区别GetFiles

显然,一个返回一个数组,另一个返回Enumerable.

还要别的吗?

Dan*_*olo 163

来自文档:

EnumerateFiles和GetFiles方法的不同之处如下:当您使用EnumerateFiles时,您可以在返回整个集合之前开始枚举名称集合; 当您使用GetFiles时,您必须等待返回整个名称数组,然后才能访问该数组.因此,当您使用许多文件和目录时,EnumerateFiles可以更高效.

所以基本上,EnumerateFiles返回一个IEnumerable可以稍微懒惰地评估,而GetFiles返回一个string[]必须在它返回之前完全填充.

  • 懒惰的评估可能不是完全免费的 - 例如,如果你最终将它放回一个数组(我看到了!).当"yagni"时,懒惰是有效的 - 所有:你不需要所有的元素,只是在几个之后停止迭代. (4认同)
  • 如果你要枚举一个如此庞大的集合,在内存中首先构建整个集合太沉重,那么惰性枚举也很有趣.您可以在物品到来时处理它们并忘记它们. (4认同)
  • 另一个很好的例子是,当您实际上并不关心任何文件,而只想检查该文件夹是否有任何文件或为空时。在这种情况下,您可以简单地使用“Directory.EnumerateFiles(path).Any()”,它将在第一个文件之后立即返回,几乎与文件夹为空时一样快。 (4认同)
  • 我查看了来源,发现这两种方法都使用内部“FileSystemEnumerableFactory.CreateFileInfoIterator()”。但是 `EnumerateFiles()` 直接返回这个迭代器,而 `GetFiles()` 从中构建额外的 `List` 并调用 `ToArray()`。因此,如果您关心速度,那么使用“EnumerateFiles()”并自己处理迭代器是有意义的。 (2认同)

Hen*_*man 30

EnumerateFiles返回IEnumerable<string>,这意味着延迟执行.它仅适用于Fx4及以上版本.

  • 这是.NET 4.0的不寻常名称 (4认同)
  • .net FrameWork 4 (3认同)
  • Fx4是什么意思? (2认同)

Sko*_*tte 14

使用EnumerateFiles时,如果您正在使用,则所有速度都会丢失.Last.这当然是有道理的,因为要到达最后一个文件,它需要枚举所有文件,然后抓住最后一个文件.

但是,使用.First.FirstOrDefault变得非常快,因为它只是抓住第一个项目并继续前进.

  • 关键是,这作为评论非常有用,但它没有回答这个问题.有一个区别. (14认同)
  • 这个非常古老的问题询问除了"Array"和"Enumerable"方面之外还有什么不同.你的答案对所有这些情况都是通用的,但没有回答问题. (6认同)
  • 关键是,在某些情况下,EnumerateFiles使您可以更快地开始访问数据。 (2认同)