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

C#中多不同类型列表的Id匹配更新与未匹配项收集优化

C# 优化多类型规则匹配与更新方案

需求回顾

遍历包含Rules的entity对象,匹配三个不同类型(ClassA、ClassB、ClassC)列表中ID一致的项并更新其Order属性;同时收集entity.Rules中未匹配任何列表的项,替代原有三个重复if的实现。

原实现的问题

  1. 效率低下:每个if中先调用Any()遍历一次集合,再调用FirstOrDefault()又遍历一次,大列表场景下会产生冗余遍历开销。
  2. 代码冗余:三个if逻辑高度重复,后续新增规则类型时需要重复编写类似代码,维护成本高。

优化方案

方案1:通过字典统一维护更新逻辑

利用字典将ID与更新Order的委托绑定,实现O(1)的查找效率,且每个列表仅遍历一次:

ClassFoo entity = GetData();
companyPolicy.AutomaticPunchRules = existingCompanyPolicy.AutomaticPunchRules;
companyPolicy.ExceptionRules = existingCompanyPolicy.ExceptionRules;
companyPolicy.AmountOfHoursRules = existingCompanyPolicy.AmountOfHoursRules;

// 构建ID到Order更新委托的字典(假设Id为Guid类型,可根据实际类型调整)
var ruleUpdaterMap = new Dictionary<Guid, Action<int>>();

// 批量添加自动打卡规则的更新逻辑
foreach (var rule in existingCompanyPolicy.AutomaticPunchRules)
{
    ruleUpdaterMap[rule.Id] = newOrder => rule.Order = newOrder;
}

// 批量添加例外规则的更新逻辑
foreach (var rule in existingCompanyPolicy.ExceptionRules)
{
    ruleUpdaterMap[rule.Id] = newOrder => rule.Order = newOrder;
}

// 批量添加时长规则的更新逻辑
foreach (var rule in existingCompanyPolicy.AmountOfHoursRules)
{
    ruleUpdaterMap[rule.Id] = newOrder => rule.Order = newOrder;
}

// 遍历entity.Rules执行更新并收集未匹配项
var unmatchedRules = new List<YourRuleType>(); // 替换为entity.Rules的实际元素类型
foreach (var rule in entity.Rules)
{
    if (ruleUpdaterMap.TryGetValue(rule.Id, out var updateAction))
    {
        updateAction(rule.Order);
    }
    else
    {
        unmatchedRules.Add(rule);
    }
}

方案2:通过统一接口简化处理

如果ClassA、ClassB、ClassC可以定义共同接口(包含Id和Order属性),代码会更简洁:

首先定义统一接口:

public interface IOrderedRule
{
    Guid Id { get; }
    int Order { get; set; }
}

// 让ClassA、ClassB、ClassC实现该接口
public class ClassA : IOrderedRule { /* 实现接口属性 */ }
public class ClassB : IOrderedRule { /* 实现接口属性 */ }
public class ClassC : IOrderedRule { /* 实现接口属性 */ }

然后简化逻辑:

ClassFoo entity = GetData();
companyPolicy.AutomaticPunchRules = existingCompanyPolicy.AutomaticPunchRules;
companyPolicy.ExceptionRules = existingCompanyPolicy.ExceptionRules;
companyPolicy.AmountOfHoursRules = existingCompanyPolicy.AmountOfHoursRules;

// 合并所有规则并转为ID映射字典
var allExistingRules = existingCompanyPolicy.AutomaticPunchRules.Cast<IOrderedRule>()
    .Concat(existingCompanyPolicy.ExceptionRules.Cast<IOrderedRule>())
    .Concat(existingCompanyPolicy.AmountOfHoursRules.Cast<IOrderedRule>())
    .ToDictionary(rule => rule.Id);

// 遍历处理并收集未匹配项
var unmatchedRules = new List<YourRuleType>();
foreach (var rule in entity.Rules)
{
    if (allExistingRules.TryGetValue(rule.Id, out var existingRule))
    {
        existingRule.Order = rule.Order;
    }
    else
    {
        unmatchedRules.Add(rule);
    }
}

方案优势

  • 性能提升:字典查找为O(1)时间复杂度,每个规则列表仅遍历一次,避免原实现的重复遍历。
  • 可维护性增强:新增规则类型时,只需在字典构建部分添加对应列表的遍历逻辑,无需重复编写匹配与更新代码。
  • 逻辑清晰:统一的处理逻辑让代码结构更简洁,可读性更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 08:10:05