C#任意嵌套列表

时间:2018-07-26 03:24:18

标签: c# list nested

在Python中,我可以将二叉树结构转换为任意嵌套列表:

BinaryTree<T>

有没有一种方法可以在C#中构建一个任意的嵌套列表?

编辑:我从MSDN docs选了一个StrBinaryTree类作为自定义FormTree类的基础类。方法 public class StrBinaryTree : BinaryTree<string> { public StrBinaryTree(string data) { if (data.Length == 0) { base.Root = null; base.Count = 0; } else { base.Root = new BinaryTreeNode<string>(); base.Root.Data = data; base.Count = 1; } } public void FormTree(BinaryTreeNode<string> node) { var subLength = node.Data.Length / 2; if (subLength == 0) return; node.Left = new BinaryTreeNode<string>(node.Data.Substring(0, subLength)); node.Right = new BinaryTreeNode<string>(node.Data.Substring(subLength)); base.Count += 2; FormTree(node.Left); FormTree(node.Right); } ...} 正在根据字符串创建树结构:

{{1}}

3 个答案:

答案 0 :(得分:2)

我将使用递归遍历树。由于您没有告诉我们树的类型,因此我们无法为您提供c#示例代码。

但是会是这样:

void List<Object> GetNestedListFromTree(Tree tree, List<Object> list = null)
{
    List<Object> curList;

    if (!tree.HasChildNodes)
        return list;
    else
    {
        if (list==null)
        {
            list = new List<Object>;
            curList = list;
        } 
        else
        {
            curList = new List<Object>;
            list.Add(curList);
        }

        foreach(node in tree.ChildNodes)
        {
            curList.Add(node.Name);
            curList.Add(GetNestedListFromTree(node.GetSubtree, curList));
        }

        return curList;
    }
}

这没有经过测试,因为我不知道您的树,是的...如果您的树可以提供所需的功能,它应该可以工作。

答案 1 :(得分:1)

尝试this solution

public static List<object> Solve(string input, List<object> list = null)
{
    if (list == null)
        return Solve(input, new List<object> { input });

    if (input.Length > 1)
    {
        var middle = input.Length / 2;
        var first = input.Substring(0, middle);
        var second = input.Substring(middle);

        var innerList = new List<object>();                       
        list.Add(innerList);

        foreach (var side in new[] { first, second })
        {
            innerList.Add(side);
            Solve(side, innerList);
        }
    }

    return list;
}

public static void Show(object input)
{
    if (!(input is string))
    {
        Console.Write("[");
        var list = input as List<object>;
        foreach (var item in list)
        {
            Show(item);
            if (item != list.Last())
                Console.Write(", ");
        }
        Console.Write("]");
    }
    else
        Console.Write(input);
}

用法:

var result = Solve("great");
Show(result);//[great, [gr, [g, r], eat, [e, at, [a, t]]]]

BinaryTreeNode的近似代码:

public static BinaryTreeNode<string> Solve(BinaryTreeNode<string> node)
{    
    if(node.Data.Length > 1)
    {
        var middle = node.Data.Length / 2;
        var left = node.Data.Substring(0, middle);
        var right = node.Data.Substring(middle);    

        node.Left = Solve(new BinaryTreeNode<string>(left));
        node.Right = Solve(new BinaryTreeNode<string>(right));      
    }

    return node;
}

用法:

var result = Solve(new BinaryTreeNode<string>("great"));

答案 2 :(得分:1)

尝试一下:

public Tree<string> Build(string text)
{
    var tree = new Tree<string>() { Value = text };
    if (text.Length > 1)
    {
        tree.Add(Build(text.Substring(0, text.Length / 2)));
        tree.Add(Build(text.Substring(text.Length / 2)));
    }
    return tree;
}

public class Tree<T> : List<Tree<T>>
{
    public T Value;
    public override string ToString()
    {
        var r = $"\"{this.Value}\"";
        if (this.Any())
        {
            r += $" [{String.Join(", ", this.Select(t => t.ToString()))}]";
        }
        return r;
    }
}

运行Build("great")会得到:

"great" ["gr" ["g", "r"], "eat" ["e", "at" ["a", "t"]]]