2011-01-31 1 views
1

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

Что вы пробовали, чтобы построить иерархию? Можете ли вы опубликовать свой код и проблемы, которые у вас есть? – Oded

+0

В чем ваш вопрос? Что дети-работники имеют отношение к чему-либо? – Qwertie

+0

@Qwertie - он хочет знать, как заполнить правильную иерархию в C#, поскольку она хранится в базе данных. – Oded

ответ

1

Вы можете начать с создания списка всех объектов, работников и установление 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); 
} 
+0

Единственная проблема заключается в том, что мой словарь заканчивается тем, что все элементы PLUS представляют собой иерархические данные. Так что, если мой список из db содержит 13 предметов, я получаю 13 предметов, а затем у некоторых предметов есть дети ... вместо 4 предметов с 9 детьми. Имеет ли это смысл? – 12354

+0

Словарь необходим только для поиска ParentId для добавления в коллекцию Children. Как только hieracrhy будет построен, вы можете полностью забыть о словаре. Если вы просто хотите корни иерархий, то просто держите ссылку на каждого из сотрудников верхнего уровня, и вы можете получить доступ к остальным через коллекции Children. –

+0

Это имеет смысл, но как я узнаю, какие родители верхнего уровня в иерархии? – 12354

2
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(); 
} 
1

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

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

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