У меня есть список элементов в иерархии, и я пытаюсь разобрать этот список на реальную иерархию объектов. Я использую модифицированный обход дерева предварительного заказа для хранения/перебора через этот список, и поэтому у меня есть подмножество дерева, включая всех дочерних элементов, упорядоченных по их «левому» значению.
Например, для дерева:
- Item A
- Item A.1
- Item A.2
- Item A.2.2
- Item B
- Item B.1
- Пункт С
Я получаю список:
- Пункт A, Пункт A.1, Пункт A.2, Пункт A.2.2, Пункт B, Пункт B.1, Пункт C
(Это в порядке «левого» значения из измененной настройки дерева предварительного заказа).
Что я хочу сделать, так это разобрать это на объекты, которые содержат фактическую структуру дерева, например:
Class TreeObject {
String Name;
Guid ID;
Guid ParentID;
List<TreeObject> Children;
}
Плоский список возвращается как список TreeObjects, и каждый TreeObject имеет свойства для ID, ParentID, Left и Right. То, что я ищу, это функция:
List<TreeObject> FlatToHeirarchy(List<TreeObject> list);
который принимает плоский список и возвращает вложенный список.
Другими словами:
List<TreeObject> flatSet = LoadTreeObjectsFromDatabase();
// flatSet.count == 7; flatSet(0).Children == null
List<TreeObject> nestedSet = FlatToHeirarchy(flatSet);
// nestedSet.count == 3; nestedSet(0).Children.count == 2
Я не знаю, как это сделать - отслеживать родителей и иметь дело с большим скачком (например, пункт A.2.2 -> пункт B).
Изменить: я ищу здесь решение без грубой силы (например, не зацикливаться несколько раз, перемещая элементы в дочерние узлы, пока не останутся только родители верхнего уровня). Я предполагаю, что есть элегантный метод, который может зацикливаться один раз и просто размещать элементы по мере необходимости.
Помните, что они всегда находятся в иерархическом порядке (поскольку я использую MPTT), поэтому данный элемент всегда будет дочерним или одноуровневым по отношению к предыдущему элементу или, по крайней мере, иметь общего родителя с предыдущим элементом. Он никогда не появится где-то еще на дереве.