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

如何用Linq查询语法按关联List<T>属性排序主List<T>

实现按指定年份销售额排序的LINQ解决方案

没问题,我来帮你搞定这个交叉表排序的需求!首先咱们得先明确两个列表对应的实体类结构(如果你的字段名和下面不一样,直接替换成你的实际字段就行):

// 员工总销售额实体
public class SalesTotals
{
    public int EmployeeId { get; set; }
    public string EmployeeName { get; set; }
    public decimal TotalSales { get; set; }
    // 其他业务字段...
}

// 员工年度销售额实体
public class YearlySales
{
    public int EmployeeId { get; set; }
    public int Year { get; set; }
    public decimal YearlyTotals { get; set; }
    // 其他业务字段...
}

接下来就是核心的SortByYear方法实现,完全用LINQ查询语法做左连接,满足你的需求:

public List<SalesTotals> SortByYear(List<SalesTotals> salesTotals, List<YearlySales> yearlySales, int targetYear)
{
    var sortedSales = from total in salesTotals
                     // 左连接:匹配员工ID和指定年份的年度销售额记录
                     join yearly in yearlySales
                         on new { total.EmployeeId, Year = targetYear } equals new { yearly.EmployeeId, yearly.Year }
                     into groupedYearlySales
                     // 处理无对应年份记录的情况,用DefaultIfEmpty()返回null
                     from matchedYearly in groupedYearlySales.DefaultIfEmpty()
                     // 排序规则:有年度记录用YearlyTotals,没有就用TotalSales
                     orderby (matchedYearly != null ? matchedYearly.YearlyTotals : total.TotalSales) descending
                     // 最终返回排序后的SalesTotals对象
                     select total;

    return sortedSales.ToList();
}

关键逻辑说明:

  • 左连接实现:用join ... into语法把匹配的年度销售额记录分组,再通过DefaultIfEmpty()确保即使没有对应年份的记录,也能保留SalesTotals的条目
  • 排序规则:三元运算符判断是否存在指定年份的记录,存在则用年度销售额排序,否则 fallback 到总销售额
  • 排序方向:示例里用的是descending(降序),如果你的默认需求是升序,改成ascending就行

测试代码示例

你可以用下面的测试代码验证效果:

// 构造测试数据
var totalSales = new List<SalesTotals>
{
    new() { EmployeeId = 1, EmployeeName = "Alice", TotalSales = 50000 },
    new() { EmployeeId = 2, EmployeeName = "Bob", TotalSales = 45000 },
    new() { EmployeeId = 3, EmployeeName = "Charlie", TotalSales = 55000 }
};

var annualSales = new List<YearlySales>
{
    new() { EmployeeId = 1, Year = 2024, YearlyTotals = 15000 },
    new() { EmployeeId = 3, Year = 2024, YearlyTotals = 20000 }
};

// 调用方法排序
var result = SortByYear(totalSales, annualSales, 2024);
// 预期排序结果:Charlie(20000)→ Alice(15000)→ Bob(45000)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:27:11