C# 如何实现人员列表动态多条件过滤,避免结果重复?
方案合理性判断
你当前的实现方案不合理,核心问题有两个:
- 逻辑不符合需求:你需要返回满足所有过滤条件的人员,但现有代码是只要满足任意一个过滤条件就会把人员加入结果,哪怕用去重逻辑修正重复问题,得到的也是满足任意条件的人员并集,和需求要求的交集完全不符。
- 性能冗余:每新增一个过滤条件就要全量遍历一次人员列表,过滤条件越多性能损耗越大。
修正方案
基础实现(无额外依赖)
核心思路改为遍历每个人员,检查是否满足所有过滤条件,全满足才加入结果,修改后的过滤逻辑如下:
List<Person> secondPersonList = new(); Dictionary<string, object> secondFilter = new(); // 示例过滤条件:性别为true、角色编号为4 secondFilter.Add("Gender", true); secondFilter.Add("Role", 4); foreach (var person in _people) { bool matchAll = true; foreach (var filter in secondFilter) { switch (filter.Key) { case "Gender": if (person.Gender != (bool)filter.Value) matchAll = false; break; case "Role": if (person.Role != (int)filter.Value) matchAll = false; break; // 后续新增过滤字段直接加对应case即可 } if (!matchAll) break; // 有一个条件不满足就终止后续检查 } if (matchAll) secondPersonList.Add(person); }
运行以上代码,输出结果只会包含符合条件的Meike,不会有重复数据,完全匹配需求。
更易扩展的LINQ实现
如果希望后续新增过滤条件时不用修改核心过滤逻辑,可以提前把各个字段的过滤规则做成配置,通用过滤逻辑如下:
// 提前定义所有支持的过滤字段的判断规则,后续新增字段只需要加这个字典的条目 var filterRules = new Dictionary<string, Func<Person, object, bool>> { {"Gender", (p, val) => p.Gender == (bool)val}, {"Role", (p, val) => p.Role == (int)val} }; // 核心过滤逻辑完全通用,无需后续修改 var result = _people.Where(p => secondFilter.All(filter => filterRules[filter.Key](p, filter.Value)) ).ToList();
这个方案的优势是:
- 仅需遍历一次人员列表,性能比原始实现更高
- 没有重复数据问题
- 扩展性强,新增过滤字段无需改动核心逻辑
内容的提问来源于stack exchange,提问作者Brekers
相关产品推荐
相关产品推荐

