C#如何筛选包含另一数组元素的数组项?多值Contains使用问题
筛选包含任意指定后缀的文件数组项
为什么你的Intersect方法无效
你用files.Intersect(filters).Any()得不到正确结果的原因很直接:Intersect是用来找两个数组中完全相等的元素。你的files里是完整文件名(比如"1.mp3"),而filters是纯后缀(比如".mp3"),两者没有完全匹配的项,所以Intersect返回空集合,Any()会返回false——如果你的代码是把这个结果作为筛选条件,逻辑写反就会导致返回所有文件。
正确的实现方式
方式1:用Array.FindAll结合多值判断
直接在Array.FindAll的筛选委托里,检查当前文件是否包含filters中的任意一个后缀:
string[] filtered = Array.FindAll(files, file => filters.Any(filter => file.Contains(filter)));
方式2:用LINQ的Where(更灵活)
如果项目引用了System.Linq,可以用Where配合Any,并且推荐用EndsWith替代Contains——因为后缀是在文件名末尾的,Contains可能误匹配文件名中间出现后缀的情况(比如"audio.mp3.txt"),EndsWith更严谨:
using System.Linq; string[] filtered = files.Where(file => filters.Any(filter => file.EndsWith(filter))).ToArray();
性能优化(针对大数据量)
如果files或filters数组很大,可以把filters转成HashSet来提升判断效率:
using System.Collections.Generic; var filterSet = new HashSet<string>(filters); string[] filtered = Array.FindAll(files, file => filterSet.Any(filter => file.EndsWith(filter)));
内容的提问来源于stack exchange,提问作者DmVinny
相关产品推荐
相关产品推荐

