C# Reactive Extensions 如何根据指定扩展名字符串动态过滤文件
实现方案
该方案仅需调用一次Where操作符,同时支持动态配置多扩展名,还能避免你原有Contains写法误匹配的问题(比如文件名包含扩展名字符但不是后缀的场景)。
步骤1:预处理允许的扩展名集合
提前把逗号分隔的配置字符串转换为哈希集合,避免每次过滤时重复拆分字符串,提升性能:
// 你的自定义配置扩展名串,可动态修改 string allowedExtConfig = "JPG,PNG,TXT"; HashSet<string> allowedExts = allowedExtConfig.Split(',', StringSplitOptions.RemoveEmptyEntries) .Select(ext => ext.Trim().ToLowerInvariant()) .ToHashSet();
步骤2:单次调用Where实现过滤
.Where(e => { // 提取文件扩展名,去掉前置的.并转小写统一匹配规则 string fileExt = Path.GetExtension(e.FullPath).TrimStart('.').ToLowerInvariant(); return allowedExts.Contains(fileExt); })
可选简化写法(适合扩展名数量少的场景)
如果允许的扩展名数量很少,不想提前维护集合,也可以直接在Where内做匹配:
.Where(e => allowedExtConfig.Split(',') .Any(ext => string.Equals( Path.GetExtension(e.FullPath).TrimStart('.'), ext.Trim(), StringComparison.OrdinalIgnoreCase )))
注意事项
- 统一大小写匹配逻辑,兼容Windows、macOS等不同系统的文件扩展名大小写不敏感的规则
- 提前拆分配置为哈希集合的方案更适合高频文件流的场景,避免每次过滤都产生字符串拆分的GC开销
内容的提问来源于stack exchange,提问作者Sebastian Halik
相关产品推荐
相关产品推荐

