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

LINQ分组后如何按ProjectNumber+SubProjectNumber降序排序并保留全列

如何在LINQ中对去重后的列表按复合键降序排序并保留原实体结构?

你遇到的问题核心是错误地再次使用了GroupBy——第二次分组后返回的是IGrouping<匿名类型, 你的实体类型>集合,而CreateHTMLTable需要的是单个实体对象的列表,自然无法兼容。

我们只需要在已完成去重的LINQ链末尾,直接添加按复合键降序排序的逻辑即可,不需要额外分组:

// 先完成去重,再直接按复合键降序排序
var ListForEmailTableDistinct = ListForEmailTable
    .GroupBy(o => new { o.ProjectNumber, o.SubProjectNumber, o.SubProjectName, o.ProjectType, o.ProjectManager, o.ErrorType })
    .Select(o => o.FirstOrDefault())
    // 按ProjectNumber + SubProjectNumber的组合降序排序
    .OrderByDescending(x => new { x.ProjectNumber, x.SubProjectNumber })
    .ToList();

为什么这样可行?

  1. 去重逻辑保持不变:通过GroupBy+FirstOrDefault得到的是去重后的单个实体列表,完整保留了所有原属性
  2. OrderByDescending直接作用于实体列表:传入的匿名类型new { x.ProjectNumber, x.SubProjectNumber }会作为排序依据,LINQ会先按ProjectNumber降序,再按SubProjectNumber降序
  3. 最终返回的仍是原实体类型的列表,完全符合CreateHTMLTable的参数要求

之后你可以直接将这个列表传入方法:

HTMLTableInString = CreateHTMLTable(ListForEmailTableDistinct, 
    x => (x?.ProjectNumber, "Project number"),
    x => (x?.SubProjectNumber, "Sub-project number"),
    x => (x?.SubProjectName, "Sub-project name"),
    x => (x?.ProjectType, "Sub-project type"),
    x => (x?.ProjectManager, "Project manager"),
    x => (x?.ErrorType, "Error type")
);

如果你的ProjectNumber或SubProjectNumber是字符串类型,排序会遵循字典序;如果是数值类型,则按数值大小排序。如果需要自定义排序规则,可以在OrderByDescending中添加对应的逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:12:20