使用 LINQ 展平树以获得最深的价值

Use LINQ to flatten tree getting deepest value

如果我有部门和员工的层级结构,像这样:

    public class TestEmployee
{
    public Guid ID { get; set; }
    public Guid TestDepartmemntID { get; set; }

    public string name { get; set; }
    public string email { get; set; }

}

public class TestDepartmemnt
{
    public Guid ID { get; set; }
    public Guid ParentTestDepartmentID { get; set; }
    public string TestDepartmentName { get; set; }
    public string? ManagerName { get; set; }
    public string phoneNumber { get; set; }
}

注意到 ManagerName 可以为空...

除了迭代祖先以找到最接近的部门经理姓名之外,是否有更优雅的方法来获取员工的直属经理姓名?

如果 Widgets Inc 的 CEO Bob 在根部,Bob 管理多个部门,其中一个部门是物流。

物流有几个部门,一个是仓库。仓库有经理Sharon.

仓库有多个部门,包括发货和收货。

Rick 从事航运工作。

Rick 的经理是 Sharon。

我可以轻松确定 Rick 在哪个部门工作,因为我可以获得 TestDepartmentID。

但是,当把瑞克从树上救下来时,我是否必须做如下事情: 获取 Ricks TestDepartmentID 的最近祖先,其中 ManagerName 不为 null 或为空?

有比递归循环更优雅的方法吗?

Linq 在 IEnumerables 上运行,因此第一步是创建一个。例如通过使用迭代器块。然后,您可以使用 .First() 或任何其他 linq 方法 return 第一个非空管理器,或您想要的任何其他查询。

    public Dictionary<Guid, TestDepartmemnt> departments = new Dictionary<Guid, TestDepartmemnt>();

    public IEnumerable<TestDepartmemnt> GetParents(Guid departmentId)
    {
        while(departments.TryGetValue(departmentId, out var department))
        {
            yield return department;
            departmentId = department.ParentTestDepartmentID;
        }
    } 

这假设您在字典中有部门。这可以替换为您用于 link 部门 ID 的任何方法。