C# 具有特定扩展名的Directory.GetFiles

C# 具有特定扩展名的Directory.GetFiles,c#,linq,directory,getfiles,C#,Linq,Directory,Getfiles,有没有办法简化这个linq表达式,或者有更好的方法 Directory.GetFiles(dir, "*.*", SearchOption.AllDirectories) .Where(s => s.EndsWith(".jpg", StringComparison.OrdinalIgnoreCase) || s.EndsWith(".gif", StringComparison.OrdinalIgnoreCase) ||

有没有办法简化这个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返回这些扩展名。这可能吗?

过载不是已经做到了吗?您只需执行
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);
    }
}

(如果您的目录很大,使用而不是
GetFiles
可能更有效)

如果您想在LINQ中进行筛选,可以这样做:

var ext = new List<string> { "jpg", "gif", "png" };
var myFiles = Directory
    .EnumerateFiles(dir, "*.*", SearchOption.AllDirectories)
    .Where(s => ext.Contains(Path.GetExtension(s).TrimStart(".").ToLowerInvariant()));
var ext=新列表{“jpg”、“gif”、“png”};
var myFiles=目录
.EnumerateFiles(目录,“**”,搜索选项.AllDirectories)
.Where(s=>ext.Contains(Path.GetExtension.TrimStart(“.”).ToLowerInvariant());

现在
ext
包含允许的扩展名列表;您可以根据需要从中添加或删除项目,以实现灵活的筛选。

我只需要像

List<string> imageFiles = Directory.GetFiles(dir, "*.*", SearchOption.AllDirectories)
      .Where(file => new string[] { ".jpg", ".gif", ".png" }
      .Contains(Path.GetExtension(file)))
      .ToList();
List imageFiles=Directory.GetFiles(dir,“**”,SearchOption.AllDirectories)
.Where(文件=>新字符串[]{.jpg“,.gif“,.png”}
.Contains(Path.GetExtension(文件)))
.ToList();

Duplicate:可能重复感谢。我喜欢这个想法,但我不确定在循环中多次调用GetFiles会有多高效。请参阅有关EnumerateFiles方法的附加注释。感谢您的建议,但EnumerateFiles似乎只适用于.net 4,但我必须使用3.5。对不起,我之前没提那件事,是我的错。好的,总是可以选择在内部
foreach
之前运行
GetFiles
一次并存储结果,然后使用
foreach
中存储的列表。请注意,使用通配符*时,总有可能会弄乱预期的逻辑。例如,您有两个文件Test1.xls和Test2.xlsx,如果您使用filter*.xls过滤掉xls文件,Directory.GetFiles**将同时返回xls和xlsx文件**。[阅读MSDN了解更多信息]:我可以执行测试,但你知道哪一个更有效吗?有趣的是它可以工作。。。从
GetFiles
上的文档来看,它似乎不像您从正则表达式中期望的那样接受
。文档说它只识别
*
,但是,如果它工作,它就工作=)注意:这在运行.NET 4.5的Win7 x64上似乎不起作用。由于管道的原因,在路径中抛出
非法字符。@SimonWhitehead没关系,我误解了,一个类似命名的方法在内部解释管道。我删除了解决方案中不起作用的部分(SSL只检查了第一个部分)。请注意:您可能会从更新的.NET 4.0
目录中获得性能提升。EnumerateFiles
,正如@nekizalbt在回答中提到的,这当然起作用,但传递给
.Where()的lambda表达式
将创建一个
字符串[]
;也就是说,对于
dir
下的每个文件。如果
dir
是,比如说,
@“C:\”
,那么这可能会创建数十个或数十万个短期“垃圾”数组。我绝对认为在
.Where()
之外定义数组是值得的,即使这意味着必须编写可怕的第二行代码。