如何基于优先级规则消除汽车匹配代码的重复冗余逻辑?
优化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; }
额外优化建议
- 性能优化:如果
carResults或specifications数据量较大,可以提前对汽车的Code、Features、Colors建立哈希集合或字典索引,比如把carResults按Code分组存成Dictionary<string, List<Car>>,减少每次匹配的遍历次数。 - 规则封装:如果规则逻辑复杂,可以把每个规则封装成单独的类(遵循策略模式),更便于管理和扩展,比如定义
IMatchRule接口,每个优先级对应一个实现类。 - 空值处理:可以给
Contains方法加空值判断,避免spec.Color或spec.Feature为null时抛出异常。
内容的提问来源于stack exchange,提问作者manaslu
相关产品推荐
相关产品推荐

