首页 > 解决方案 > 控制台树视图 C#

问题描述

大家好,这是我第一次发帖!:D

我有一个关于在 C# 的控制台应用程序中创建某种树视图的问题。我有一个文本文件,其中填充了许多行,这些行具有它们的 ID、文本和 ParentID。

我的任务是对每一行进行排序,因此 ParentID == 0 的那个是第一个,然后是其余的,但是我必须使用递归方法来排序。

到目前为止,我已经设法解析文本文件,将其放入一个类中并将这些类放在一个列表中,但是我在递归部分中没有成功。这是我不成功的尝试:

static void Main(string[] args)
        {
            string[] lines = File.ReadAllLines(@"C:\Users\text.txt");
            List<Object> objects = new List<Object>();
            foreach (string line in lines)
            {
                string[] col = line.Split(",");
                objects.Add(new Object(int.Parse(col[0]), col[1], int.Parse(col[2])));
            }
            Recursive(objects, objects.Count-1);

            foreach (var obj in objects)
            {
                Console.WriteLine("{0},{1},{2}", obj.ID, obj.name, obj.ParentID);
            }

        }
        public static object Recursive(List<Object> objects, int a)
        {

            if (objects[a].ParentID == 0)
            {
                return objects[a];
            }
            else
            {
               return Recursive(objects, a-1);

            }
            
        }
    }

    public class Object
    {

        public int ID;
        public string name;
        public int ParentID;

        public Object(int ID, string name, int ParentID)
        {
            this.ID = ID;
            this.name = name;
            this.ParentID = ParentID;
        }
    }

如果有人知道如何解决这个问题,我将不胜感激。我理解递归函数的概念,但我似乎无法绕过这个特定分配的逻辑。

这是文本文件的示例:

1,text,0
2,text,1
3,text,2
4,text,5
5,text,1
6,text,4

标签: c#

解决方案


以下是我的做法:

public static void Main (string[] args) {
    // obviously, you're using a text file, but this part is inconsequential
    string[] lines = "1,a,0|2,b,1|3,c,2|4,d,5|5,e,1|6,f,4".Split("|");

    List<Object> objects = new List<Object>();
    foreach(String line in lines) {
        string[] col = line.Split(",");
        objects.Add(new Object(int.Parse(col[0]), col[1], int.Parse(col[2])));
    }

    Recursive(objects, 0, 0);
}

public static void Recursive(List<Object> nodes, int parent, int level) {
    String tabs = new String('\t', level);
    foreach(Object node in nodes) {
        if (node.ParentID == parent) {
            Console.WriteLine(tabs + node.name);
            Recursive(nodes, node.ID, level+1);
        }
    }
}

这是Repl.it 上的完整示例

顺便说一句,当您说它们应该“按顺序”输出时,我们都假设您正在寻找深度优先搜索。


推荐阅读