У меня есть список элементов в иерархии, и я пытаюсь разобрать этот список в фактическую иерархию объектов. Я использую измененный обход дерева предварительного заказа для хранения/повторения этого списка, и поэтому у меня есть подмножество дерева, в том числе все дети, упорядоченные по их "левому" значению.
Например, учитывая дерево:
- Пункт A
- Пункт A.1
- Пункт A.2
- Пункт A.2.2
- Пункт B
- Пункт B.1
- Пункт C
Я получаю список:
- Пункт А, Пункт А .1, Пункт А .2, Пункт А .2.2, Пункт В, Элемент Б .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
Я не понимаю, как это сделать - отслеживание родителей и возможность справиться с большим прыжком (например, Item A.2.2 → Item B).
Изменить: я ищу здесь решение без грубой силы (например, не повторяя несколько циклов, перемещая элементы в дочерние узлы, пока не осталось только родителей верхнего уровня). Я предполагаю, что есть элегантный метод, который может зацикливаться один раз и просто поместить элементы по мере необходимости.
Помните, что они всегда находятся в иерархическом порядке (поскольку я использую MPTT), поэтому данный элемент всегда будет дочерним или родственным из предыдущего элемента или, по крайней мере, разделяет родителя с предыдущим элементом. Он никогда не появится где-то еще в дереве.