如何创建层次结构ID

时间:2010-08-30 11:28:57

标签: c# hierarchy

我想创建一个生成层次结构ID的方法,如下所示

1.0
 1.1
   1.1.1
   1.1.2
   1.1.3

 1.2
 1.3
2.0
 2.1

有没有办法实现这个目标? 任何帮助将受到高度赞赏。

2 个答案:

答案 0 :(得分:3)

这是我的快速尝试。

我假设代替1.02.0分别只是12,否则会产生不一致。

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