【发布时间】:2011-08-05 21:24:15
【问题描述】:
Directory.EnumerateFiles 与 GetFiles 有什么区别?
显然一个返回一个数组,另一个返回 Enumerable。
还有什么?
【问题讨论】:
Directory.EnumerateFiles 与 GetFiles 有什么区别?
显然一个返回一个数组,另一个返回 Enumerable。
还有什么?
【问题讨论】:
来自the docs:
EnumerateFiles 和 GetFiles 方法的区别如下: 使用 EnumerateFiles 时,可以在返回整个集合之前开始枚举名称集合;当您使用 GetFiles 时,您必须等待返回整个名称数组,然后才能访问该数组。因此,当您处理许多文件和目录时,EnumerateFiles 会更高效。
所以基本上,EnumerateFiles 返回一个 IEnumerable,它可以进行一些延迟评估,而 GetFiles 返回一个 string[],它必须在返回之前完全填充。
【讨论】:
FileSystemEnumerableFactory.CreateFileInfoIterator()。但是EnumerateFiles() 直接返回这个迭代器,而GetFiles() 从它构建额外的List 并调用ToArray()。因此,如果您关心速度,使用EnumerateFiles() 并自己处理迭代器是有意义的。
Directory.EnumerateFiles(path).Any(),它将在第一个文件之后立即返回,并且几乎与文件夹为空时一样快。
EnumerateFiles 返回IEnumerable<string>,这意味着延迟执行。它仅适用于 .net 4 及更高版本。
由于文件系统的速度非常慢(尤其是对于大型文件夹),延迟执行对于顺序处理来说可能是一个真正的好处。取决于许多其他因素。
【讨论】:
使用 EnumerateFiles 时,如果您使用 .Last,所有速度都会丢失。这当然是有道理的,因为要到达最后一个文件,它需要枚举所有文件,然后抓取最后一个。
但是,使用 .First 或 .FirstOrDefault 会变得非常快,因为它只是抓取第一个项目并继续前进。
【讨论】:
Array 与Enumerable 方面之外还有什么区别。您的回答对所有此类情况都是通用的,但没有回答所提出的问题。