【问题标题】:Hierarchy from Flat Data平面数据的层次结构
【发布时间】:2011-01-31 19:52:36
【问题描述】:

我有一个员工类,它有一个employeeId (int)、parent(int) 和children 属性List<Employee>。我以正确的顺序从数据库中获取员工列表现在需要构建层次结构,但我失败得很惨……我知道这是编程 101,但我很难它。

public class Employee
{
  public int EmployeeId { get; set;}
  public int ParentId;{ get; set;}
  public List<Employee> Children; { get; set;}

}

数据示例

EmployeeId, ManagerId
1, 0 //no one
2, 1
3, 1
4, 2
5, 2
6, 3
7, 3

【问题讨论】:

  • 您尝试过什么来构建层次结构?你能发布你的代码和你遇到的问题吗?
  • 你有什么问题?员工的孩子跟什么有什么关系?
  • @Qwertie - 他想知道如何在 C# 中填充正确的层次结构,因为它存储在数据库中。
  • @Oded,我尝试跟踪 parentId 并在父 id 与当前项目的父 id 相同时添加子项,但在进入 2+ 级时失败。
  • @Qwertie,我把问题改成了粗体。

标签: c# hierarchy


【解决方案1】:
List<Employee> allEmployees = new List<Employee>();
allEmployees.AddRange(LoadAllEmployees()); // pull from DB in flat format    
foreach (var employee in allEmployees)
{
  employee.Children = allEmployees.Where(e => e.ParentId == employee.EmployeeId).ToList();
}

【讨论】:

    【解决方案2】:

    您可以首先创建所有员工对象的列表并设置EmployeeIdParentId 属性。如果您还将它们放入字典中,以EmployeeId 为键,则可以检索每个的父级以添加到Children 集合中:

    List<Employee> employees = new List<Employee>();
    Dictionary<int,Employee> dict = new Dictionary<int,Employee>();
    
    foreach(result from database query)
    {
       Employee employee = new Employee();
       employee.EmployeeId = result["EmployeeId"];
       employee.ParentId = result["ParentId"];
       employees.Add(employee);
       dict.Add(employee.EmployeeId, employee);
    }
    
    foreach(Employee e in employees)
    { 
      dict[e.ParentId].Children.Add(e);
    }
    

    【讨论】:

    • 唯一的问题是我的字典最终包含所有项目以及分层数据。因此,如果我的数据库列表包含 13 个项目,我最终得到 13 个项目,然后其中一些项目有孩子......而不是说 4 个项目有 9 个孩子。这有意义吗?
    • 字典仅用于查找 ParentId 以添加到 Children 集合。一旦构建了层次结构,您就可以完全忘记字典。如果您只想要层次结构的根,那么只需保留对每个顶级员工的引用,您就可以通过 Children 集合访问其余部分。
    • 有道理,但我怎么知道哪些是层次结构中的顶级父级?
    • 如果所有顶级员工的 ParentId 为零,则在遍历员工列表时选择那些,例如,if (e.ParentId==0) topLevelEmployees.Add(e);
    【解决方案3】:

    不久前我从这篇文章中得到了灵感(我不得不稍微改变它以适应我的目的)。它基本上构建了一个层次结构到第n级。

    可能有用,即使只是在您自己的情况下打折它的方法:-)

    http://www.scip.be/index.php?Page=ArticlesNET23&Lang=EN

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-20
      • 1970-01-01
      • 2013-12-06
      • 2013-01-22
      • 1970-01-01
      • 1970-01-01
      • 2022-11-03
      • 1970-01-01
      相关资源
      最近更新 更多