如何编写可复用的C# GroupBy分组函数?
复用分组逻辑的解决方案
你可以通过将分组键选择逻辑与核心聚合初始化逻辑解耦来解决重复代码和维护成本高的问题。核心思路是把通用的40个Meb属性初始化逻辑抽离成单独的可复用块,分组键作为参数传入,这样新增或修改分组维度时无需改动核心逻辑。
当前问题代码(反例)
你现在的两个分组函数大概率存在大量重复的属性初始化代码:
// 按Numero分组 public Dictionary<string, Meb> GroupByNumero(List<Meb> mebs) { return mebs.GroupBy(m => m.Numero) .ToDictionary(g => g.Key, g => new Meb { Numero = g.Key, Prop1 = g.Sum(m => m.Prop1), Prop2 = g.Max(m => m.Prop2), // ... 剩下38个属性的初始化逻辑,和另一个函数完全重复 }); } // 按CNC分组 public Dictionary<string, Meb> GroupByCnc(List<Meb> mebs) { return mebs.GroupBy(m => m.CNC) .ToDictionary(g => g.Key, g => new Meb { CNC = g.Key, Prop1 = g.Sum(m => m.Prop1), Prop2 = g.Max(m => m.Prop2), // ... 同样的38个重复代码 }); }
优化后的实现
步骤1:抽离核心属性初始化逻辑
把40个属性的初始化逻辑单独封装成私有方法,后续修改仅需改动此处:
private void PopulateMebAggregateProperties(Meb targetMeb, IEnumerable<Meb> sourceGroup) { // 这里编写所有40个属性的聚合逻辑(求和、取最大/最小值、平均值等) targetMeb.Prop1 = sourceGroup.Sum(m => m.Prop1); targetMeb.Prop2 = sourceGroup.Max(m => m.Prop2); targetMeb.Prop3 = sourceGroup.Average(m => m.Prop3); targetMeb.Prop4 = sourceGroup.FirstOrDefault(m => m.Prop4 != null)?.Prop4; // ... 剩余36个属性的初始化逻辑 }
步骤2:编写通用分组方法
用泛型+委托接收分组键选择器,以及分组键赋值到Meb对象的逻辑:
public Dictionary<TKey, Meb> GroupMebs<TKey>(List<Meb> mebs, Func<Meb, TKey> keySelector, Action<Meb, TKey> assignKeyToMeb) { return mebs.GroupBy(keySelector) .ToDictionary( group => group.Key, group => { var aggregatedMeb = new Meb(); // 给当前分组对应的Meb属性赋值(如Numero或CNC) assignKeyToMeb(aggregatedMeb, group.Key); // 调用核心初始化方法填充其他40个属性 PopulateMebAggregateProperties(aggregatedMeb, group); return aggregatedMeb; }); }
步骤3:调用通用方法实现不同维度分组
新增或修改分组维度只需一行代码,完全无需触碰核心初始化逻辑:
// 按Numero分组 var groupedByNumero = GroupMebs(mebsList, m => m.Numero, (meb, key) => meb.Numero = key); // 按CNC分组 var groupedByCnc = GroupMebs(mebsList, m => m.CNC, (meb, key) => meb.CNC = key); // 后续新增按Code分组示例 var groupedByCode = GroupMebs(mebsList, m => m.Code, (meb, key) => meb.Code = key);
优势说明
- 核心聚合逻辑仅维护一次,修改属性初始化规则时无需改动多个分组函数
- 分组维度与聚合逻辑完全解耦,新增分组方式成本极低
- 代码冗余度大幅降低,可读性和可维护性显著提升
内容的提问来源于stack exchange,提问作者Siegfried.V
相关产品推荐
相关产品推荐

