使用 EnumerateFiles 和多个过滤器文件扩展名读取文件

问题描述

我需要从文件夹和子文件夹动态加载文件

我使用此代码加载我的文件

    var files = Directory.EnumerateFiles(path,"*.*",SearchOption.AllDirectories)
        .Where(s => s.EndsWith(".txt") || s.EndsWith(".xml") || s.EndsWith(".log") || s.EndsWith(".csv"))
        .ToList();

它很慢,但比我已经尝试过的所有其他方法都要好。

现在我想更改此行以使其具有动态性,以便我可以过滤我的扩展

.Where(s => s.EndsWith(".txt") || s.EndsWith(".xml") || s.EndsWith(".log") || s.EndsWith(".csv"))

所以,第一步我用这个替换我的行:

filter.Split('|').ToList().ForEach(y =>
{
    files.AddRange(Directory.EnumerateFiles(path,SearchOption.AllDirectories)
        .Where(s => s.EndsWith(y))
        .ToList());
});

但是我也可以删除 Where 指令并使用 EnumerateFiles() 中的过滤器。是的,确定。但问题也出在这样做时,我多次调用 EnumerateFiles() 并且速度更慢。

我能做什么?

这样更好吗

var allFiles = Directory.EnumerateFiles(path,SearchOption.AllDirectories);
var files = new List<string>();

filter.Split('|').ToList().ForEach(y =>
{
    files.AddRange(allFiles.Where(s => s.EndsWith(y)).ToList());
});

解决方法

我会做以下事情

var extensions = filter.Split('|').ToHashSet(StringComparer.OrdinalIgnoreCase);
var files = Directory.EnumerateFiles(path,"*.*",SearchOption.AllDirectories)
    .Where(s => extensions.Contains(Path.GetExtension(s)))
    .ToList();

编辑:

仅供参考,您的 Is this better 代码与您之前的代码 100% 相同。 IEnumerable 是惰性的,只会在使用时执行,因此在循环外声明 var allFiles = Directory.EnumerateFiles(path,SearchOption.AllDirectories); 没有任何区别。

请看这里的演示: https://dotnetfiddle.net/UZj8lr