Иерархия из плоских данных

У меня есть класс сотрудников, который имеет свойство 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

person 12354    schedule 31.01.2011    source источник
comment
Что вы пробовали для построения иерархии? Можете ли вы опубликовать свой код и проблемы, которые у вас возникли?   -  person Oded    schedule 31.01.2011
comment
Каков твой вопрос? При чем здесь Дети работника?   -  person Qwertie    schedule 31.01.2011
comment
@Qwertie - он хочет знать, как заполнить правильную иерархию в C #, поскольку она хранится в базе данных.   -  person Oded    schedule 31.01.2011
comment
@Oded, я пытался отслеживать parentId и добавлять дочерние элементы, если родительский идентификатор совпадает с родительским идентификатором текущего элемента, но затем потерпел неудачу при переходе на уровень 2+.   -  person 12354    schedule 31.01.2011
comment
@Qwertie, я выделил вопрос жирным шрифтом.   -  person 12354    schedule 31.01.2011
comment
@ 12345 - вы сортировали записи по ManagerId?   -  person Oded    schedule 31.01.2011
comment
@Oded - Да, результат отсортирован. Я делал это раньше, просто не могу найти src. Я знаю, что может быть задействована некоторая рекурсия (возможно, нет, поскольку она отсортирована...), но я потратил некоторое время, пытаясь понять это... разочарование.   -  person 12354    schedule 31.01.2011


Ответы (2)


Вы можете начать с создания списка всех объектов сотрудников и установки свойств EmployeeId и ParentId. Если вы также поместите их в словарь с ключом 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);
}
person Mark Cidade    schedule 31.01.2011
comment
единственная проблема в том, что в моем словаре есть все элементы ПЛЮС иерархические данные. Итак, если мой список из базы данных содержит 13 элементов, я получаю 13 элементов, а затем у некоторых элементов есть дочерние элементы... вместо, скажем, 4 элементов с 9 дочерними элементами. Имеет ли это смысл? - person 12354; 31.01.2011
comment
Словарь нужен только для поиска ParentId для добавления в коллекцию Children. Как только иерархия построена, можно вообще забыть о словаре. Если вам нужны только корни иерархий, просто сохраните ссылку на каждого из сотрудников верхнего уровня, и вы сможете получить доступ к остальным через коллекции Children. - person Mark Cidade; 31.01.2011
comment
Это имеет смысл, но как мне узнать, какие из родителей являются высшими уровнями в иерархии? - person 12354; 01.02.2011
comment
Если у всех сотрудников высшего уровня ParentId равен нулю, выберите их при повторении списка сотрудников, например, if (e.ParentId==0) topLevelEmployees.Add(e); - person Mark Cidade; 01.02.2011

Я получил вдохновение от этой статьи некоторое время назад (мне пришлось немного изменить ее, чтобы она соответствовала моим целям). Он в основном строит иерархическую структуру до n-й степени.

Может быть полезно, хотя бы для того, чтобы обесценить его подход в вашем собственном случае :-)

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

person jim tollan    schedule 31.01.2011