基于参数过滤对象列表及Officer与Person列表过滤实现咨询
嘿,这个问题很典型——你踩了个类型匹配的小坑,我来给你掰扯清楚:
首先,你为啥会遇到类型不匹配?因为你调用filterName时传的officers.Select(o=>o.person.name).ToList(),本质是把每个Officer里的Person的名字字符串提取出来,得到的是List<string>类型,但你的filterName方法要求的参数是List<Person>,这俩类型完全对不上,编译器肯定要报错。
接下来给你几种正确的实现方式,看你具体需求:
1. 从Officer列表提取Person后再过滤
直接把Officer里的Person对象整个取出来,而不是只取name:
// 正确的调用方式 List<Officer> officers = ...; // 你的Officer集合 List<Person> filteredPersons = filterName(officers.Select(o => o.person).ToList());
然后你的filterName方法可以正常写针对Person的过滤逻辑,比如筛选名字包含特定关键词的Person:
public List<Person> filterName(List<Person> list) { // 举个例子:过滤名字不为空且包含"John"的Person return list.Where(p => !string.IsNullOrEmpty(p.name) && p.name.Contains("John")).ToList(); }
2. 直接用LINQ链式处理(无需单独写方法)
如果你的过滤逻辑不需要复用,其实可以直接把提取和过滤放一起,更简洁:
var filteredPersons = officers .Select(o => o.person) // 先取出每个Officer对应的Person .Where(p => p.name.Contains("John")) // 按名字过滤 .ToList();
3. 复用名字过滤逻辑(更灵活的写法)
可以把过滤条件抽成一个委托,这样不管是处理独立的Person列表还是Officer里的Person,都能复用:
// 定义通用的名字过滤规则 Func<Person, bool> nameFilter = p => !string.IsNullOrEmpty(p.name) && p.name.StartsWith("Dr."); // 过滤独立的Person列表 List<Person> personList = ...; var filteredPersons = personList.Where(nameFilter).ToList(); // 过滤Officer列表里的Person var filteredOfficerPersons = officers.Select(o => o.person).Where(nameFilter).ToList();
核心要点就是:你要传给filterName的是Person对象的列表,而不是名字字符串的列表——别只把name抽出来,要把整个Person对象传进去,方法才能拿到name属性做过滤判断。
内容的提问来源于stack exchange,提问作者Raj
相关产品推荐
相关产品推荐

