如何筛选Class属性存在于指定字符串中的Vehicle对象?
我来帮你修正这个问题,你确实搞反了判断逻辑,而且还有个小细节导致编译错误,咱们一步步来解决:
第一步:优化查询用的集合
首先把你的逗号分隔字符串转换成一个高效的查询集合,推荐用HashSet<string>——它的Contains方法查询速度远快于直接操作字符串,尤其是当attrs内容较多的时候:
// 分割字符串,同时去除每个项的前后空格(如果你的Class属性没有空格的话) var allowedClasses = new HashSet<string>(attrs.Split(',').Select(s => s.Trim()));
第二步:修正筛选逻辑并解决编译错误
接下来调整你的筛选代码,同时注意把IEnumerable结果转成List——因为Where返回的是懒加载的IEnumerable<Vehicle>,无法直接赋值给List<Vehicle>类型的变量:
vehiclesSort = vehiclesSort.Where(o => allowedClasses.Contains(o.Class)).ToList();
解释原代码的问题
- 逻辑反转:你之前写的
o.Class.Contains(attrs)是判断Vehicle的Class属性里包含整个attrs字符串(比如Class是"AAABBBCCC"才会匹配),这和你想要的「Class属性值是attrs中的某一项」完全相反。 - 编译错误:
Where方法返回的是IEnumerable<Vehicle>,而你的vehiclesSort是List<Vehicle>类型,直接赋值会出现类型不匹配的错误,调用ToList()就能解决这个问题。
额外优化建议
如果你的Class属性和attrs里的项大小写不敏感(比如"aaa"和"AAA"视为相同),可以在创建HashSet时指定忽略大小写的比较器:
var allowedClasses = new HashSet<string>(attrs.Split(',').Select(s => s.Trim()), StringComparer.OrdinalIgnoreCase);
内容的提问来源于stack exchange,提问作者user9127893
相关产品推荐
相关产品推荐

