【问题标题】:What is the difference between Directory.EnumerateFiles vs Directory.GetFiles?Directory.EnumerateFiles 与 Directory.GetFiles 有什么区别?
【发布时间】:2011-08-05 21:24:15
【问题描述】:

Directory.EnumerateFilesGetFiles 有什么区别?

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

还有什么?

【问题讨论】:

    标签: c# .net directory io


    【解决方案1】:

    来自the docs

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

    所以基本上,EnumerateFiles 返回一个 IEnumerable,它可以进行一些延迟评估,而 GetFiles 返回一个 string[],它必须在返回之前完全填充。

    【讨论】:

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

    EnumerateFiles 返回IEnumerable<string>,这意味着延迟执行。它仅适用于 .net 4 及更高版本。

    由于文件系统的速度非常慢(尤其是对于大型文件夹),延迟执行对于顺序处理来说可能是一个真正的好处。取决于许多其他因素。

    【讨论】:

    • Fx4 是什么意思?
    • .net 框架 4
    • 这是 .NET 4.0 的一个不同寻常的名称
    【解决方案3】:

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

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

    【讨论】:

    • 这个非常古老的问题询问了除了ArrayEnumerable 方面之外还有什么区别。您的回答对所有此类情况都是通用的,但没有回答所提出的问题。
    • 重点是,在某些情况下,EnumerateFiles 可以让您更快地开始访问数据。
    • 重点是,这作为评论非常有用,但不能回答问题。有区别。
    猜你喜欢
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    • 2011-02-19
    • 2013-03-14
    • 2018-09-14
    • 2014-01-03
    • 2021-12-22
    • 2017-10-25
    相关资源
    最近更新 更多