在C#实际业务开发中,经常需要对员工类数据进行筛选和排序操作,比如筛选出部门为ABC的员工,再按照薪水从高到低或者从低到高排序,使用LINQ可以非常简洁地实现这个需求,不需要编写复杂的循环逻辑。

定义员工实体类
首先需要定义员工的基础实体类,包含部门、薪水等必要属性,后续的操作都基于这个实体类展开。
// 定义员工实体类
public class Employee
{
// 员工姓名
public string Name { get; set; }
// 所属部门
public string Department { get; set; }
// 员工薪水
public decimal Salary { get; set; }
}
准备测试数据
先初始化一个包含不同部门、不同薪水员工的列表,用于后续演示筛选和排序的效果。
// 初始化员工列表
List<Employee> employees = new List<Employee>
{
new Employee { Name = "张三", Department = "ABC", Salary = 8000.50m },
new Employee { Name = "李四", Department = "DEF", Salary = 12000.00m },
new Employee { Name = "王五", Department = "ABC", Salary = 9500.00m },
new Employee { Name = "赵六", Department = "ABC", Salary = 7500.00m },
new Employee { Name = "孙七", Department = "DEF", Salary = 11000.00m }
};
使用LINQ筛选并排序
LINQ提供了Where方法用于筛选数据,OrderBy和OrderByDescending方法用于排序,我们可以链式调用这些方法完成需求。
按薪水升序排序
先筛选出部门为ABC的员工,再按照薪水从低到高排序,代码如下:
// 筛选部门为ABC的员工,按薪水升序排序
var sortedEmployeesAsc = employees
.Where(e => e.Department == "ABC") // 筛选部门为ABC的员工
.OrderBy(e => e.Salary) // 按薪水升序排序
.ToList();
// 输出排序结果
foreach (var emp in sortedEmployeesAsc)
{
Console.WriteLine($"姓名:{emp.Name},部门:{emp.Department},薪水:{emp.Salary}");
}
上述代码的运行结果如下:
姓名:赵六,部门:ABC,薪水:7500.00 姓名:张三,部门:ABC,薪水:8000.50 姓名:王五,部门:ABC,薪水:9500.00
按薪水降序排序
如果需要按照薪水从高到低排序,只需要把OrderBy换成OrderByDescending即可:
// 筛选部门为ABC的员工,按薪水降序排序
var sortedEmployeesDesc = employees
.Where(e => e.Department == "ABC") // 筛选部门为ABC的员工
.OrderByDescending(e => e.Salary) // 按薪水降序排序
.ToList();
// 输出排序结果
foreach (var emp in sortedEmployeesDesc)
{
Console.WriteLine($"姓名:{emp.Name},部门:{emp.Department},薪水:{emp.Salary}");
}
降序排序的运行结果如下:
姓名:王五,部门:ABC,薪水:9500.00 姓名:张三,部门:ABC,薪水:8000.50 姓名:赵六,部门:ABC,薪水:7500.00
注意事项
- 使用
Where筛选时,条件表达式需要和实际业务匹配,这里部门是字符串类型,注意大小写是否敏感,如果需要忽略大小写可以改用e.Department.Equals("ABC", StringComparison.OrdinalIgnoreCase)。 - 如果薪水字段可能为null,排序前需要先处理空值,避免运行时出现异常。
- LINQ的链式调用会返回一个新的集合,不会修改原始的员工列表,如果需要更新原始列表可以重新赋值。