C#刺绣作业排序函数开发:按设计名分组且同OrderId保持相邻
实现思路
你需要先把所有任务按OrderId分组绑定,保证同订单的条目不会被拆分,再对分组后的订单组按设计名称排序,最后扁平化得到结果。核心是把整个订单作为排序的基本单元,而不是单个设计条目,才能同时满足「同名设计集中」和「同订单条目相邻」两个要求。
代码实现
方案1:用LINQ实现(逻辑更清晰,推荐)
var sortedJobs = embroideryJobs // 第一步:按OrderId分组,同订单的条目先聚合到一起 .GroupBy(job => job.OrderId) // 第二步:对订单组排序,优先按订单内最小的设计名称排序(如果需要按订单第一个设计的名称排序,可改为 group.First().DesignProcessData[0].Name) .OrderBy(orderGroup => orderGroup.Min(job => job.DesignProcessData[0].Name)) // 第三步:设计名称相同的订单按OrderId排序,保证排序结果稳定 .ThenBy(orderGroup => orderGroup.Key) // 第四步:同订单内部按设计名称排序(如果需要保留订单内原有条目顺序,可去掉.OrderBy的部分) .SelectMany(orderGroup => orderGroup.OrderBy(job => job.DesignProcessData[0].Name)) .ToList();
方案2:用Sort方法实现(适合无法使用LINQ的场景)
需要先预处理每个订单对应的排序主键:
// 先构建字典,缓存每个OrderId对应的组排序主键 Dictionary<int, string> orderSortKeyMap = embroideryJobs .GroupBy(job => job.OrderId) .ToDictionary( group => group.Key, group => group.Min(job => job.DesignProcessData[0].Name) ); embroideryJobs.Sort((EmbroideryJob a, EmbroideryJob b) => { // 优先对比订单组的排序主键 int keyCompare = orderSortKeyMap[a.OrderId].CompareTo(orderSortKeyMap[b.OrderId]); if (keyCompare != 0) return keyCompare; // 组主键相同的情况下按OrderId排序,保证同订单条目相邻 int orderCompare = a.OrderId.CompareTo(b.OrderId); if (orderCompare != 0) return orderCompare; // 同订单内部按设计名称排序 return a.DesignProcessData[0].Name.CompareTo(b.DesignProcessData[0].Name); });
原代码问题说明
你原来的代码优先按OrderId排序,会把包含同名设计的不同订单打散到列表的不同位置,自然无法实现同名设计集中展示的需求。
内容的提问来源于stack exchange,提问作者Rob_Da_Joyce
相关产品推荐
相关产品推荐

