Я предполагаю, что ваша иерархия выражается в виде дерева с использованием этого класса:
class Node {
public Node() { Children = new Node[0]; }
public String Name { get; set; }
public IEnumerable<Node> Children { get; set; }
}
Затем вы можете посетить каждый узел дерева, используя этот метод:
void Visit(Node node, Stack<Int32> levels, Action<Node, String> nodeAction) {
// Generation of hierachyId can be customized here to say use letters.
var hierarchyId =
String.Join(".", levels.Reverse().Select(l => l.ToString()).ToArray());
nodeAction(node, hierarchyId);
var i = 1;
foreach (var child in node.Children) {
levels.Push(i++);
Visit(child, levels, nodeAction);
levels.Pop();
}
}
Этот код будет посещать каждый узел дерева в глубине первого порядка, включая корень. Однако в корне будет пустой hierarchyId
. Чтобы начать посещение дерева, используйте этот код:
Visit(
root,
new Stack<int>(),
(node, hierarchyId) => Console.WriteLine(hierarchyId + ": " + node.Name)
);
Действие просто запишет имя узла и сгенерированный идентификатор иерархии в консоль.
Вот некоторые примеры данных:
var root = new Node {
Name = "Root",
Children = new[] {
new Node {
Name = "A",
Children = new[] {
new Node {
Name = "AA",
Children = new [] {
new Node { Name = "AAA" },
new Node { Name = "AAB" },
new Node { Name = "AAC" }
}
},
new Node { Name = "AB" },
new Node { Name = "AC" }
}
},
new Node {
Name = "B",
Children = new Node[] {
new Node { Name = "BA" }
}
}
}
};
При запуске кода в этом дереве в консоль записывается следующее:
: Root
1: A
1.1: AA
1.1.1: AAA
1.1.2: AAB
1.1.3: AAC
1.2: AB
1.3: AC
2: B
2.1: BA