階層内にアイテムのリストがあり、このリストを解析してオブジェクトの実際の階層にしようとしています。このリストを保存/反復するために、変更された事前注文ツリー トラバーサルを使用しているため、すべての子を含むツリーのサブセットが「左」の値で並べられています。
たとえば、次のツリーがあるとします。
- アイテムA
- アイテムA.1
- アイテムA.2
- アイテムA.2.2
- アイテムB
- 項目 B.1
- アイテム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 を使用しているため)、特定のアイテムは常に前のアイテムの子または兄弟になるか、少なくとも前のアイテムと親を共有します。ツリーの他の場所に来ることは決してありません。