有没有办法简化这个linq表达式,还是有更好的方法呢?
Directory.GetFiles(dir, "*.*", SearchOption.AllDirectories)
.Where(s => s.EndsWith(".jpg", StringComparison.OrdinalIgnoreCase) ||
s.EndsWith(".gif", StringComparison.OrdinalIgnoreCase) ||
s.EndsWith(".png", StringComparison.OrdinalIgnoreCase) ||
...);
基本上我想要返回某个扩展名的所有文件。不幸的是,这种方法不是很灵活。我宁愿能够在列表中添加扩展名,并让Directory.GetFiles返回这些扩展名。这可能吗?
答案 0 :(得分:91)
如果您想在LINQ中进行过滤,可以这样做:
var ext = new List<string> {".jpg", ".gif", ".png"};
var myFiles = Directory.GetFiles(dir, "*.*", SearchOption.AllDirectories)
.Where(s => ext.Contains(Path.GetExtension(s)));
现在ext
包含允许的扩展名列表;您可以根据需要添加或删除项目以进行灵活过滤。
答案 1 :(得分:13)
Directory.GetFiles(String, String)
重载是否已经这样做了?你只需Directory.GetFiles(dir, "*.jpg", SearchOption.AllDirectories)
如果要将它们放在列表中,那么只需将"*.jpg"
替换为遍历列表的变量,并将结果聚合到整个结果集中。比单独指定它们要清楚得多。 =)
像...一样的东西。
foreach(String fileExtension in extensionList){
foreach(String file in Directory.GetFiles(dir, fileExtension, SearchOption.AllDirectories)){
allFiles.Add(file);
}
}
(如果您的目录很大,使用EnumerateFiles
代替GetFiles
可能会更有效率)
答案 2 :(得分:4)
我会像
一样使用单行List<string> imageFiles = Directory.GetFiles(dir, "*.*", SearchOption.AllDirectories)
.Where(file => new string[] { ".jpg", ".gif", ".png" }
.Contains(Path.GetExtension(file)))
.ToList();