は、ここではそれを実行する必要が何をすべきなアルゴリズムです。あなたのデータは順序通りであると仮定し、O(n)で実行します。
class Node {
Node Parent;
List<Node> Children = new List<Node>();
int NodeId;
string Data;
public Node(NodeRow row) { ... }
}
- が
current
として最初の行をロードします。 まず、あなたはこのようになりますノードを必要としています。
- 次の行をロードします。
newRow.ParentNodeId
〜current.NodeId
を比較してください。
- あなたが一致するものを見つけるまで、
current.Children
にnewRow
を追加し、新しい行にcurrent
を設定current = current.Parent
- を設定します。
- 行くことだ2.
をステップ!データが正しく構造化されていることが保証されている場合は、追加のnull
チェックを行う必要はありません。
サンプル:
Node CreateTree(IEnumerable<NodeRow> rows) {
Node root = null;
Node current = null;
foreach (var row in rows) {
// Root:
if (root == null) {
root = current = new Node(row);
continue;
}
// Traverse up the tree until the parent is found:
while (row.ParentNodeId != current.NodeId) {
current = current.Parent;
}
// Add the new node as a child of the current one:
var rowNode = new Node(row);
rowNode.Parent = current;
current.Children.Add(rowNode);
current = rowNode;
}
return root;
}
おそらく関連:http://stackoverflow.com/questions/444296/how-to-efficiently-build-a-tree-from-a-flat-structure辞書を使用しています親ノードを追跡することができ、おそらく最も簡単な方法です。私は辞書を必要としない再帰的な解法を使ってきましたが、それをもう一度派生させなければならないほど長いことでした。 –
これは、オーダーフォームのようには見えません。その場合、rootはテーブルの最初のノードではありません。あなたは予約注文を意味しましたか? – svick