如何创建层次结构 ID

发布于 2024-09-17 01:24:00 字数 132 浏览 3 评论 0原文

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

1.0
 1.1
   1.1.1
   1.1.2
   1.1.3

 1.2
 1.3
2.0
 2.1

,是否有实现此目的的方法? 任何帮助将不胜感激。

I'd like to make a method to generate a hierarchy ID like the following

1.0
 1.1
   1.1.1
   1.1.2
   1.1.3

 1.2
 1.3
2.0
 2.1

is there and way to accomplish this ?
any help will be highly appreciated.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

最终幸福 2024-09-24 01:24:00

这是我的快速尝试。

我假设您分别指的是 12,而不是 1.02.0,否则它会不一致。

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
    }
}

Here is my quick attempt.

I am assuming that instead of 1.0 and 2.0 you meant just 1 and 2, respectively, as otherwise it would be inconsistent.

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
    }
}
大海や 2024-09-24 01:24:00

我假设您的层次结构使用此类表示为一棵树:

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

I'll assume that your hierarchy is expressed like a tree using this class:

class Node {
  public Node() { Children = new Node[0]; }
  public String Name { get; set; }
  public IEnumerable<Node> Children { get; set; }
}

You can then visit each node in the tree using this method:

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();
  }
}

This code will visit each node in the tree in a depth first order including the root. However, the root will have an empty hierarchyId. To start visiting the tree use this code:

Visit(
  root,
  new Stack<int>(),
  (node, hierarchyId) => Console.WriteLine(hierarchyId + ": " + node.Name)
);

The action will simply write the node name and generated hierarchy id to the console.

Here are some sample data:

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" }
      }
    }
  }
};

Running the code on this tree writes the following to the console:

: 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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文