.NET Core 6下使用LINQ按指定扩展名列表过滤文件的实现方案问询
用LINQ替代循环实现文件扩展名筛选
没问题!把你现有的循环逻辑转成LINQ写法非常简洁,核心思路就是用LINQ的Where方法做条件筛选,最后用ToList()转换成你需要的List<string>类型。
基础LINQ实现
下面是直接对应你原有循环逻辑的LINQ版本:
private List<string> FilterFilesWithAcceptedExtension(List<string> files, List<string> acceptedExtensions) { return files .Where(file => acceptedExtensions.Contains(Path.GetExtension(file))) .ToList(); }
这段代码的逻辑和你原来的循环完全一致:遍历每个文件,获取它的扩展名,检查是否在目标扩展名列表中,最后把符合条件的文件收集成列表返回。
优化:处理大小写不一致的情况
实际场景中,文件扩展名可能存在大小写差异(比如.CSV和.csv),如果你的需求是忽略大小写匹配,可以做如下优化:
private List<string> FilterFilesWithAcceptedExtension(List<string> files, List<string> acceptedExtensions) { return files .Where(file => acceptedExtensions.Contains( Path.GetExtension(file), StringComparer.OrdinalIgnoreCase)) .ToList(); }
这里利用了Contains方法的重载,传入StringComparer.OrdinalIgnoreCase来实现不区分大小写的匹配,比手动转大小写更高效且安全。
另一种优化:提前统一扩展名格式
如果你担心重复调用ToLowerInvariant()的性能(比如文件列表非常大),也可以先把目标扩展名列表统一转成小写,再进行匹配:
private List<string> FilterFilesWithAcceptedExtension(List<string> files, List<string> acceptedExtensions) { var normalizedAcceptedExtensions = acceptedExtensions .Select(ext => ext.ToLowerInvariant()) .ToList(); return files .Where(file => normalizedAcceptedExtensions.Contains( Path.GetExtension(file).ToLowerInvariant())) .ToList(); }
内容的提问来源于stack exchange,提问作者K.Z
相关产品推荐
相关产品推荐

