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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 05:54:00