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

如何基于优先级规则消除汽车匹配代码的重复冗余逻辑?

优化C#重复匹配逻辑的方案

你的核心问题是把每个优先级的匹配逻辑都重复实现了一遍,既冗余又难维护(新增P4-P7还要写一堆foreach)。下面是规范且易扩展的实现方式:

核心思路

把每个优先级的匹配条件抽象成规则委托,按优先级顺序存入列表,然后用一个统一的循环遍历规则,只要找到符合当前规则的汽车就立即返回,彻底消除重复代码。

优化后代码

public string GetMatchingCar(string carCode)
{
    var carResults = new List<Car>
    {
        new Car{Name="AB car", Code="AB", Colors = new List<string>{"blue","green","black"}, Features=new List<string>{"compact","fast","light"} },
        new Car{Name="AC car", Code="AC", Colors = new List<string>{"gray","white","yellow"}, Features=new List<string>{"extended","fast","heavy"} },
        new Car{Name="DE car", Code="DE", Colors = new List<string>{"red","green","purple"}, Features=new List<string>{"sports","light"} },
        // 其他汽车数据
    };

    var specifications = new List<Specification>
    {
        new Specification{Color="blue", Feature="heavy"},
        new Specification{Color="red", Feature="light"},
        new Specification{Color="maroon", Feature="compact"},
        new Specification{Color="black", Feature="manual"},
        new Specification{Color="neon", Feature="heavy"},
        // 其他规格数据
    };

    // 按优先级顺序定义匹配规则:每个规则接收carCode、spec、car,返回是否匹配
    var matchRules = new List<Func<string, Specification, Car, bool>>
    {
        // P1: Code + Color + Feature
        (code, spec, car) => car.Code.Equals(code) && car.Colors.Contains(spec.Color) && car.Features.Contains(spec.Feature),
        // P2: Code + Feature
        (code, spec, car) => car.Code.Equals(code) && car.Features.Contains(spec.Feature),
        // P3: Feature
        (code, spec, car) => car.Features.Contains(spec.Feature),
        // 新增P4-P7直接在这里加规则即可,不用写新循环
        // (code, spec, car) => ... 
    };

    // 统一遍历规则和规格,找到第一个匹配项就返回
    foreach (var rule in matchRules)
    {
        foreach (var spec in specifications)
        {
            var matchedCar = carResults.FirstOrDefault(car => rule(carCode, spec, car));
            if (matchedCar != null)
            {
                return matchedCar.Name;
            }
        }
    }

    return string.Empty;
}

额外优化建议

  1. 性能优化:如果carResults或specifications数据量较大,可以提前对汽车的Code、Features、Colors建立哈希集合或字典索引,比如把carResults按Code分组存成Dictionary<string, List<Car>>,减少每次匹配的遍历次数。
  2. 规则封装:如果规则逻辑复杂,可以把每个规则封装成单独的类(遵循策略模式),更便于管理和扩展,比如定义IMatchRule接口,每个优先级对应一个实现类。
  3. 空值处理:可以给Contains方法加空值判断,避免spec.Color或spec.Feature为null时抛出异常。

内容的提问来源于stack exchange,提问作者manaslu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 00:45:53