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

使用LINQ实现C#方法:传入EmployeeId获取指定员工的所有下属

用LINQ实现递归查找员工所有下属的C#方法

需求背景

员工表中每个员工包含EmployeeId和SupervisorId字段,员工分为五级:普通员工、主管、经理、副总监、总监。其中总监的SupervisorId与自身EmployeeId相同(即自己为自己的上级)。需要实现一个方法,传入某个员工的EmployeeId,返回该员工的所有层级下属(包括直属下属、下属的下属,直到最底层普通员工)。


递归实现方案

基于你已获取的activeEmployeeList(在职员工列表),可以通过递归+LINQ的方式实现需求:

public List<Employee> GetAllSubordinates(int targetEmployeeId, List<Employee> activeEmployees)
{
    // 筛选目标员工的直属下属,排除自身(避免总监被误算为自己的下属)
    var directSubordinates = activeEmployees
        .Where(e => e.SupervisorId == targetEmployeeId && e.EmployeeId != targetEmployeeId)
        .ToList();

    // 递归获取每个直属下属的所有下属,合并所有层级结果
    var allSubordinates = directSubordinates.Concat(
        directSubordinates.SelectMany(sub => GetAllSubordinates(sub.EmployeeId, activeEmployees))
    ).ToList();

    return allSubordinates;
}

代码说明

  1. 第一步先筛选出目标员工的直属下属,通过e.SupervisorId == targetEmployeeId匹配,同时加e.EmployeeId != targetEmployeeId排除总监自身(因为总监的SupervisorId等于自己)。
  2. 第二步通过SelectMany递归调用方法,获取每个直属下属的所有下属,再用Concat把直属下属和间接下属合并成完整的下属列表。

迭代实现方案(避免栈溢出)

如果公司组织架构层级极深,递归可能引发栈溢出,此时可以用迭代+队列的方式实现:

public List<Employee> GetAllSubordinatesIterative(int targetEmployeeId, List<Employee> activeEmployees)
{
    var allSubordinates = new List<Employee>();
    var employeeQueue = new Queue<Employee>();

    // 初始化队列,加入目标员工的直属下属
    var directSubordinates = activeEmployees
        .Where(e => e.SupervisorId == targetEmployeeId && e.EmployeeId != targetEmployeeId)
        .ToList();
    directSubordinates.ForEach(employeeQueue.Enqueue);

    while (employeeQueue.Count > 0)
    {
        var currentEmployee = employeeQueue.Dequeue();
        allSubordinates.Add(currentEmployee);

        // 把当前员工的直属下属加入队列,继续遍历
        var subordinates = activeEmployees.Where(e => e.SupervisorId == currentEmployee.EmployeeId).ToList();
        subordinates.ForEach(employeeQueue.Enqueue);
    }

    return allSubordinates;
}

关于你现有代码的说明

你提供的代码是用来筛选所有有下属的员工(即主管、经理、副总监、总监):

  • 通过自连接activeEmployeeList,将员工作为上级(e1)和下属(e2)关联,找出所有被其他员工设为上级的人员。
  • 最后通过Distinct去重,得到所有具备管理职责的员工列表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 02:13:25