如何基于另一列表的顺序条件过滤对象列表?
问题描述
我正在解决基于另一列表的值过滤对象列表的问题:
List 1(电话对象列表):
[ {"Number":"324234","PhoneType":"Cell"}, {"Number":"645645","PhoneType":"Work"}, {"Number":"3453453","PhoneType":"phone"}, {"Number":"342","PhoneType":"fax"} ]
List 2(优先级类型列表):
["Work","Cell","phone","Fax"]
核心条件
- 按List 2的顺序从List 1中查找匹配记录,找到第一个存在的类型就返回对应记录
- 过滤时必须排除
Fax(大小写不敏感)类型 - List 2的内容和顺序不固定(可能仅包含部分类型,顺序随时变化)
示例逻辑
如果List 2首项是Work,List 1存在该类型记录则直接返回;若不存在则继续查找List 2的下一项Cell,以此类推,直到找到符合条件的记录或遍历结束。
此前尝试的问题代码
尝试1:
var results = List1.Where((item, index) => list2[index] == "work");
问题:错误地用List1的索引匹配List2元素,逻辑完全错误,应按List2顺序匹配PhoneType值。
尝试2:
var primaryPhone = list1?.FirstOrDefault(p => !p.PhoneType.Equals("Fax") && !p.MediaType.Equals("Fax"));
问题:仅返回List1中第一条非Fax的记录,完全未遵循List2的优先级顺序。
解决方案
方式1:Lambda表达式结合LINQ实现
核心逻辑是先过滤List2中的Fax类型,再按优先级顺序在List1中查找第一个匹配项:
// 过滤List2中的Fax类型,保留原顺序(大小写不敏感) var filteredPriorityTypes = list2.Where(type => !string.Equals(type, "Fax", StringComparison.OrdinalIgnoreCase)).ToList(); // 按优先级顺序查找第一个匹配的记录 var primaryPhone = filteredPriorityTypes .Select(type => list1.FirstOrDefault(item => string.Equals(item.PhoneType, type, StringComparison.OrdinalIgnoreCase))) .FirstOrDefault(result => result != null);
方式2:foreach循环实现(更直观)
遍历优先级列表,找到第一个匹配项就终止循环:
PhoneItem primaryPhone = null; foreach (var priorityType in list2) { // 跳过Fax类型(大小写不敏感) if (string.Equals(priorityType, "Fax", StringComparison.OrdinalIgnoreCase)) continue; // 在List1中查找当前优先级的记录 var match = list1.FirstOrDefault(item => string.Equals(item.PhoneType, priorityType, StringComparison.OrdinalIgnoreCase)); if (match != null) { primaryPhone = match; break; // 找到第一个匹配项后立即终止循环 } }
关键说明
- 加入大小写不敏感匹配,避免因List1的
fax和List2的Fax大小写不一致导致漏判 - 先过滤List2中的Fax类型,确保不会查找该类型的记录
- 严格遵循List2的优先级顺序,找到第一个存在的匹配项就返回,完全符合需求
内容的提问来源于stack exchange,提问作者Nishanth
相关产品推荐
相关产品推荐

