【问题标题】:Use LINQ to flatten tree getting deepest value使用 LINQ 展平树以获得最深的价值
【发布时间】:2020-06-22 15:49:51
【问题描述】:

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

    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 不为空或为空?

有没有比递归循环更优雅的方法来做到这一点?

【问题讨论】:

  • Linq 不适用于分层(递归方法)。最好的方法是您正在使用和迭代的方法。如果您经常这样做,那么创建所有祖先的字典会更快。
  • 递归循环过什么? List<T> ? DataTable? Dictionary<TKey, TValue>?您如何创建对象和集合?另外,您是否可以选择重构这些类? ....
  • 您正在使用主键和外键。这是要在 IQueryable 中使用吗?
  • 我现在正在迭代。让所有员工,然后是他们的部门,然后迭代。提供的答案似乎是一种合理的方法,我必须对其进行测试。

标签: c# linq hierarchy


【解决方案1】:

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

    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;
        }
    } 

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-13
    • 1970-01-01
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    相关资源
    最近更新 更多