У меня есть список элементов в иерархии, и я пытаюсь разобрать этот список в фактическую иерархию объектов. Я использую измененный обход дерева предзаказа для хранения / итерации по этому списку, и поэтому у меня есть подмножество дерева, включая все дочерние элементы, упорядоченные по их «левому» значению.
Например, с учетом дерева:
- Элемент A
- Элемент B
- Элемент C
Я получаю список:
- Элемент 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), поэтому данный элемент всегда будет дочерним или родным по отношению к предыдущему элементу или, по крайней мере, разделит родительский элемент с предыдущим элементом. Оно никогда не придет куда-нибудь еще на дереве.