在c#中对list进行多字段排序,应使用linq的 orderby 结合 thenby 方法。具体做法是调用 list<t>.asenumerable()</t> 或直接用 orderby 指定主排序键,随后链式调用 thenby 指定次排序键,这样会得到一个按主键升序、主键相同时按次键升序排列的新序列。

如何确保主键相同的数据按次键稳定排序?
当主键值存在重复时,ThenBy 会介入处理这些重复项的相对顺序。它保证在 OrderBy 确定的主键分组内,数据严格按照 ThenBy 指定的条件进行二次排序。这种组合是稳定的,即如果两个元素的主键和次键都相同,它们的原始相对位置会被保留。

using System;
using System.Collections.Generic;
using System.Linq;
public class Employee
{
public string Name { get; set; }
public int DepartmentId { get; set; }
public int Salary { get; set; }
}
public class Program
{
public static void Main()
{
var employees = new List<Employee>
{
new Employee { Name = "Alice", DepartmentId = 101, Salary = 5000 },
new Employee { Name = "Bob", DepartmentId = 102, Salary = 6000 },
new Employee { Name = "Charlie", DepartmentId = 101, Salary = 5500 },
new Employee { Name = "David", DepartmentId = 101, Salary = 5000 }
};
// 先按部门ID升序,再按薪资升序
var sortedEmployees = employees
.OrderBy(e => e.DepartmentId)
.ThenBy(e => e.Salary)
.ToList();
foreach (var emp in sortedEmployees)
{
Console.WriteLine($"{emp.Name}: Dept {emp.DepartmentId}, Salary {emp.Salary}");
}
}
}
预期输出结果如下: Alice: Dept 101, Salary 5000 David: Dept 101, Salary 5000 Charlie: Dept 101, Salary 5500 Bob: Dept 102, Salary 6000
注意 Alice 和 David 的部门ID和薪资完全相同,它们在结果中的相对顺序与输入列表一致,体现了稳定性。
如果需要使用降序排序该如何调整代码?
若需对某个字段进行降序排列,应将对应的排序方法替换为 OrderByDescending 或 ThenByDescending。例如,先按部门ID升序,再按薪资降序,只需将第二个排序条件改为 ThenByDescending。这种混合升降序的组合非常常见,用于满足复杂的业务展示需求。

// 修改上述代码中的排序逻辑
var mixedSortedEmployees = employees
.OrderBy(e => e.DepartmentId) // 主键:升序
.ThenByDescending(e => e.Salary) // 次键:降序
.ToList();
foreach (var emp in mixedSortedEmployees)
{
Console.WriteLine($"{emp.Name}: Dept {emp.DepartmentId}, Salary {emp.Salary}");
}
预期输出结果如下: Charlie: Dept 101, Salary 5500 Alice: Dept 101, Salary 5000 David: Dept 101, Salary 5000 Bob: Dept 102, Salary 6000
在此例中,部门101内的员工按薪资从高到低排列,而部门102的员工排在最后。这展示了 ThenByDescending 在实际应用中的效果。


















