Вам необходимо вычислить отдел элементов в иерархии и отсортировать список по отделу:
Если следующий класс лица:
class Person
{
public string Name {get; private set;}
public string Parent {get; private set;}
public Person(string name, string parent)
{
this.Name = name;
this.Parent = parent;
}
}
Это пример метода, который вычисляет глубину человека в иерархии.
int GetDept(List<Person> list, Person person)
{
if (person.Parent == null) return 0;
return GetDept(list, list.First(p => p.Name == person.Parent)) + 1;
}
Затем метод можно использовать для сортировки списка по dept
.
List<Person> persons = new List<Person>();
// populate it
persons.Add(new Person("child", "father"));
persons.Add(new Person("father", "grandfather"));
persons.Add(new Person("grandfather", "grandgrandfather"));
persons.Add(new Person("grandgrandfather", null));
var sorted = persons.OrderBy(p => GetDept(persons, p));
foreach(var person in sorded)
Console.WriteLine("{0} {1} {2}", person.Name, person.Parent, GetDept(persons, p))
Будет напечатано:
grandgrandfather null 0
grandfather grandgrandfather 1
father grandfather 2
child father 3
Обратите внимание, что в этом примере dept не вычисляется эффективно, так как метод GetDept
будет вызываться сам снова и снова, а также он использует O (n) поиск в списке. Все это может быть улучшено путем вычисления dept только один раз для каждого человека и его хранения в сочетании с более эффективным механизмом поиска, таким как словарь, для обеспечения хорошей производительности для больших наборов данных.