我想创建一个生成层次结构ID的方法,如下所示
1.0 1.1 1.1.1 1.1.2 1.1.3 1.2 1.3 2.0 2.1
有没有办法实现这个目标? 任何帮助将受到高度赞赏。
答案 0 :(得分:3)
这是我的快速尝试。
我假设代替1.0
和2.0
分别只是1
和2
,否则会产生不一致。
public class HierarchyGenerator
{
private List<int> levels = new List<int> { 1 };
public void DownOneLevel()
{
levels.Add(1);
}
public void UpLevels(int numLevels)
{
if (levels.Count < numLevels + 1)
throw new InvalidOperationException(
"Attempt to ascend beyond the top level.");
for (int i = 0; i < numLevels; i++)
levels.RemoveAt(levels.Count - 1);
MoveNext();
}
public void MoveNext()
{
levels[levels.Count - 1]++;
}
public string Current
{
get
{
return new string(' ', (levels.Count - 1) * 2)
+ string.Join(".", levels.Select(l => l.ToString()));
}
}
}
static partial class Program
{
static void Main()
{
var hg = new HierarchyGenerator();
Console.WriteLine(hg.Current); // 1
hg.DownOneLevel();
Console.WriteLine(hg.Current); // 1.1
hg.DownOneLevel();
Console.WriteLine(hg.Current); // 1.1.1
hg.MoveNext();
Console.WriteLine(hg.Current); // 1.1.2
hg.MoveNext();
Console.WriteLine(hg.Current); // 1.1.3
hg.UpLevels(1);
Console.WriteLine(hg.Current); // 1.2
hg.MoveNext();
Console.WriteLine(hg.Current); // 1.3
hg.UpLevels(1);
Console.WriteLine(hg.Current); // 2
hg.DownOneLevel();
Console.WriteLine(hg.Current); // 2.1
}
}
答案 1 :(得分:2)
我假设您的层次结构使用此类表示为树:
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)
);
该操作只是将节点名称和生成的层次结构ID写入控制台。
以下是一些示例数据:
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