用C#创建树结构的紧凑语法

maf*_*afu 3 c# data-structures

我想以简洁的方式在代码中创建一个有点复杂的树结构.现在我正在使用这个(简化):

var root = new Tree();
var c1 = root.Add("1");
var c2 = root.Add("2");
var c21 = c2.Add("2-1");
var c22 = c2.Add("2-2");
//...
Run Code Online (Sandbox Code Playgroud)

平均节点宽度为4,树高约为5,因此上述过程非常繁琐,更不用说难以维护.

让我们假设稍后不会通过名称访问节点.可以根据需要调整树/节点类.性能可以忽略不计.通过XML或类似方法创建是不可能的(节点构造函数实际上要复杂得多).

我正在寻找的是类似下面的内容,但我不确定如何在C#中实现它.在Java中,这可以通过匿名类实现,这些类在C#中不能用于此目的.

var root = new Tree() {
    Add("1");
    Add("2") {
        Add("2-1");
        Add("2-2");
    };
}
Run Code Online (Sandbox Code Playgroud)

我能想到的最好的解决方案是使用类似于以下的run-on声明,我认为它很难维护:

// AddXxx returns the added node
var root = new Tree()
    .Add("1")
    .AddSibling("2")
        .Add("2-1")
        .AddSibling("2-2")
    .AddParent("3")
        .Add("3-1")
Run Code Online (Sandbox Code Playgroud)

或者:

// Add now always adds a sibling, Children/Parent steps up/down in the hierarchy
var root = new Tree()
    .Children
    .Add("1")
    .Add("2")
        .Children
        .Add("2-1")
        .Add("2-2")
    .Parent
    .Add("3")
        .Children
        .Add("3-1")
Run Code Online (Sandbox Code Playgroud)

Cod*_*und 6

我会做这样的事情:

public class Tree
{
    public string Name { get; private set; }
    public List<Tree> Trees { get; private set; }

    public Tree(string name)
    {
        this.Name = name;
        this.Trees = new List<Tree>();
    }

    public Tree(string name, params Tree[] nodes)
        : this(name)
    {
        if (nodes == null || !nodes.Any()) return;
        Trees.AddRange(nodes);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

var trees = new List<Tree>
{
    new Tree("1"),
    new Tree("2",
        new Tree("2-1"),
        new Tree("2-2",
            new Tree("2-2-1"),
            new Tree("2-2-1")
        )
    ),
    new Tree("3",
        new Tree("3-1")
    )
};
Run Code Online (Sandbox Code Playgroud)

我受到了XElement构造函数的启发,它使XML节点创建具有更高的可读性.如果您正在使用XML,那么我建议使用该类.