You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 15:45:01