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


145

Directory.EnumerateFilesvs和有GetFiles什么区别?

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

还要别的吗?

Answers:


173

文档

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

因此,基本上,EnumerateFiles返回值a IEnumerable可以稍作延迟评估,而GetFiles返回值a string[]必须先完全填充后才能返回。


5
惰性评估可能不会完全免费-例如,如果您最终将其放回数组中(我看到了!)。当“ yagni” -all时,Lazy是有效的:您将不需要所有元素,仅需在几个元素之后停止迭代即可。
Tomasz Gandor 2013年

5
如果您要枚举一个太大的集合以至于在内存中首先构建整个集合,那么惰性枚举也很有趣。您可以在物品出现时就对其进行处理而忘记它们。
斯特凡纳·古里科

1
@TomaszGandor:或者在不需要存储所有文件名的情况下,例如在重命名文件时。
塞巴斯蒂安·马赫

我调查了资料来源,发现这两种方法都使用internal FileSystemEnumerableFactory.CreateFileInfoIterator()。但是EnumerateFiles()直接返回此迭代器,同时从中GetFiles()构造其他List内容并调用ToArray()。因此,如果您关心速度,则可以自己使用EnumerateFiles()和处理迭代器。
C0DEF52


16

使用EnumerateFiles时,如果再使用,则所有速度都会丢失.Last。这当然是有道理的,因为要获取最后一个文件,将需要枚举所有文件,然后获取最后一个文件。

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


6
这个非常老的问题问,除了Arrayvs Enumerable方面还有什么区别。您的答案适用于所有此类情况,但不能回答所提出的问题。
Ashigore 2014年

2
关键是,在某些情况下,EnumerateFiles使您可以更快地开始访问数据。
斯科特2015年

16
关键是,这作为注释非常有用,但不能回答问题。有区别。
2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.