如何使用LINQ筛选字段值存在于指定字符串列表中的集合数据
解决方案
这个需求可以直接通过LINQ实现,你之前的写法错误的原因是混淆了Contains方法的调用主体和参数,同时存在int和string的类型不匹配问题,正确实现如下:
方案1:直接转换年份为字符串匹配(适合内存对象查询场景)
直接将Member的Year属性转为字符串,判断是否存在于yearList中:
// 注意LINQ方法名是大写开头的Where,C#是大小写敏感的 var filteredResult = data.Where(x => yearList.Contains(x.Year.ToString())).ToList();
方案2:先转换年份列表为int集合(性能更优,兼容EF等ORM数据库查询场景)
提前把字符串类型的年份列表转为int集合,避免循环中重复做字符串转换,执行效率更高:
// 先把年份列表转为int类型 List<int> yearIntList = yearList.Select(yearStr => int.Parse(yearStr)).ToList(); // 再做筛选 var filteredResult = data.Where(x => yearIntList.Contains(x.Year)).ToList();
错误原因说明
Contains是集合类的方法,作用是判断「参数传入的值」是否存在于当前集合中,所以正确的写法是集合.Contains(待检查的值),你之前写的x.Year.Contains(yearList)完全颠倒了调用关系- C#是大小写敏感的,你写的
where小写也会导致编译报错,正确的LINQ方法名是大写的Where - Member的Year属性是int类型,和字符串类型的yearList存在类型差异,必须做显式的类型转换才能匹配
注:你给出的示例预期结果中包含了2014年的Bea,应该是笔误,以上代码执行后会正确筛选出2012年的Ralph、Rafael,以及2015年的Lee,共3条符合条件的数据。
内容的提问来源于stack exchange,提问作者Ralph Jason Caballes
相关产品推荐
相关产品推荐

