问题描述
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