C# 控制台树视图C

C# 控制台树视图C,c#,C#,各位,这是我第一次发帖!:D 我有一个关于在C中的控制台应用程序中创建某种树视图的问题。 我有一个文本文件,其中填充了许多行,其中有它们的ID、文本和父ID 我的任务是对每一行进行排序,因此ParentID==0的那一行是第一行,其余的将紧随其后,但我必须对顺序使用递归方法 到目前为止,我已经成功地解析了文本文件,将其放在一个类中,并将这些类放在一个列表中,但递归部分并没有成功。以下是我失败的尝试: static void Main(string[] args) {

各位,这是我第一次发帖!:D

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

我的任务是对每一行进行排序,因此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;
        }
    }

当前,您的程序正在使用类似while循环的递归来查找ParentID==0的对象

虽然您可以使用这种逻辑来实现一种冒泡排序,它使用递归而不是循环,但我不确定为什么有人会这样做,一个更好的解决方案是使用像MergeSort这样的递归排序将对象列表按ParentID的顺序排列

通过谷歌搜索,您可以轻松学习如何使用MergeSort或许多其他递归排序。这里有一个链接,可以很好地解释merge-sort,其中包含一个python实现,您应该能够根据自己的需要进行调整

如果您不熟悉排序,那么您可以使用谷歌排序算法,或者这里有一个不错的链接


当前,您的程序正在使用类似while循环的递归来查找ParentID==0的对象

虽然您可以使用这种逻辑来实现一种冒泡排序,它使用递归而不是循环,但我不确定为什么有人会这样做,一个更好的解决方案是使用像MergeSort这样的递归排序将对象列表按ParentID的顺序排列

通过谷歌搜索,您可以轻松学习如何使用MergeSort或许多其他递归排序。这里有一个链接,可以很好地解释merge-sort,其中包含一个python实现,您应该能够根据自己的需要进行调整

如果您不熟悉排序,那么您可以使用谷歌排序算法,或者这里有一个不错的链接

请尝试以下操作:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.txt";
        static List<Object> objects = new List<Object>();
        static void Main(string[] args)
        {
            string[] lines = File.ReadAllLines(FILENAME);
            foreach (string line in lines)
            {
                string[] col = line.Split(new char[] { ',' });
                objects.Add(new Object(int.Parse(col[0]), col[1], int.Parse(col[2])));
            }
            int root = 0;
            int level = 0;
            Recursive(root, level);
            Console.ReadLine();

        }
        public static void Recursive(int parent, int level)
        {
            List<Object> nodes = objects.Where(x => x.ParentID == parent).ToList();

            if (nodes.Count() > 0)
            {
                foreach (Object node in nodes)
                {
                    Console.WriteLine("{0}ID : '{1}', Name : '{2}'", new string(' ', 5 * level), node.ID, node.name);
                    Recursive(node.ID, level + 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;
        }
    }
}
以下是具有类似代码的表单项目:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace WindowsFormsApplication68
{
    public partial class Form1 : Form
    {
        static List<Object> objects = new List<Object>();
 
        public Form1()
        {
            InitializeComponent();

            DataTable dt = new DataTable();
            dt.Columns.Add("ID", typeof(int));
            dt.Columns.Add("Name", typeof(string));
            dt.Columns.Add("ParentID", typeof(int));

            dt.Rows.Add(new object[] {1, Text, null});
            dt.Rows.Add(new object[] {2, Text, 1});
            dt.Rows.Add(new object[] {3, Text, 1});
            dt.Rows.Add(new object[] {4, Text, 2});
            dt.Rows.Add(new object[] {5, Text, 4});
            dt.Rows.Add(new object[] {6, Text, 2});
            dt.Rows.Add(new object[] {7, Text, 3});

            foreach (DataRow row in dt.AsEnumerable())
            {
                objects.Add(new Object(row.Field<int>(0), row.Field<string>(1), row.Field<int?>(2)));
            }
            int? root = null;
            int level = 0;
            TreeNode node = null;
            Recursive(node, root, level);
            treeView1.ExpandAll();
        }
        public void Recursive(TreeNode parentNode, int? parent, int level)
        {
            List<Object> nodes = objects.Where(x => x.ParentID == parent).ToList();

            if (nodes.Count() > 0)
            {
                foreach (Object node in nodes)
                {
                    string message = string.Format("{0}ID : '{1}', Name : '{2}'", new string(' ', 5 * level), node.ID, node.name);
                    TreeNode newNode = new TreeNode(message);
                    if(parentNode == null)
                    {
                        treeView1.Nodes.Add(newNode);
                    }
                    else
                    {
                        parentNode.Nodes.Add(newNode);
                    }
                    Recursive(newNode, node.ID, level + 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;
        }
    }
}
请尝试以下操作:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.txt";
        static List<Object> objects = new List<Object>();
        static void Main(string[] args)
        {
            string[] lines = File.ReadAllLines(FILENAME);
            foreach (string line in lines)
            {
                string[] col = line.Split(new char[] { ',' });
                objects.Add(new Object(int.Parse(col[0]), col[1], int.Parse(col[2])));
            }
            int root = 0;
            int level = 0;
            Recursive(root, level);
            Console.ReadLine();

        }
        public static void Recursive(int parent, int level)
        {
            List<Object> nodes = objects.Where(x => x.ParentID == parent).ToList();

            if (nodes.Count() > 0)
            {
                foreach (Object node in nodes)
                {
                    Console.WriteLine("{0}ID : '{1}', Name : '{2}'", new string(' ', 5 * level), node.ID, node.name);
                    Recursive(node.ID, level + 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;
        }
    }
}
以下是具有类似代码的表单项目:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace WindowsFormsApplication68
{
    public partial class Form1 : Form
    {
        static List<Object> objects = new List<Object>();
 
        public Form1()
        {
            InitializeComponent();

            DataTable dt = new DataTable();
            dt.Columns.Add("ID", typeof(int));
            dt.Columns.Add("Name", typeof(string));
            dt.Columns.Add("ParentID", typeof(int));

            dt.Rows.Add(new object[] {1, Text, null});
            dt.Rows.Add(new object[] {2, Text, 1});
            dt.Rows.Add(new object[] {3, Text, 1});
            dt.Rows.Add(new object[] {4, Text, 2});
            dt.Rows.Add(new object[] {5, Text, 4});
            dt.Rows.Add(new object[] {6, Text, 2});
            dt.Rows.Add(new object[] {7, Text, 3});

            foreach (DataRow row in dt.AsEnumerable())
            {
                objects.Add(new Object(row.Field<int>(0), row.Field<string>(1), row.Field<int?>(2)));
            }
            int? root = null;
            int level = 0;
            TreeNode node = null;
            Recursive(node, root, level);
            treeView1.ExpandAll();
        }
        public void Recursive(TreeNode parentNode, int? parent, int level)
        {
            List<Object> nodes = objects.Where(x => x.ParentID == parent).ToList();

            if (nodes.Count() > 0)
            {
                foreach (Object node in nodes)
                {
                    string message = string.Format("{0}ID : '{1}', Name : '{2}'", new string(' ', 5 * level), node.ID, node.name);
                    TreeNode newNode = new TreeNode(message);
                    if(parentNode == null)
                    {
                        treeView1.Nodes.Add(newNode);
                    }
                    else
                    {
                        parentNode.Nodes.Add(newNode);
                    }
                    Recursive(newNode, node.ID, level + 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;
        }
    }
}

我会这样做:

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);
        }
    }
}
这是我的建议


顺便说一句,当你说它们应该按顺序输出时,我们都假设你正在寻找一个新的输出

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);
        }
    }
}
这是我的建议


顺便说一句,当您说应该按顺序输出数据时,我们都假设您正在寻找一个示例。

发布数据示例。发布后,感谢您抽出时间查看我的问题!:我不确定这是否过于复杂,但在赋值中是否可以使用某种递归排序?i、 e合并排序。目前,您的代码似乎只搜索父ID为0的对象并返回它。您的ID是否保证从0开始,并且在排序后始终是连续整数?如果是这样的话,那么我们可以修改你得到的,这样它就可以工作了,但是我想知道你是否应该像Jack Walton建议的那样实现一个递归排序算法。您可以发布作业的实际要求吗?@Idle\u注意是的,ParentID 0应该是root,其余的应该按照其ParentID的顺序。发布数据示例。发布,感谢您抽出时间查看我的问题!:我不确定这是否过于复杂,但在赋值中是否可以使用某种递归排序?i、 e合并排序。目前,您的代码似乎只搜索父ID为0的对象并返回它。您的ID是否保证从0开始,并且在排序后始终是连续整数?如果是这样的话,那么我们可以修改你得到的,这样它就可以工作了,但是我想知道你是否应该像Jack Walton建议的那样实现一个递归排序算法。您可以发布作业的实际要求吗?@Idle\u注意是的,父ID 0应该是根,其余的应该按照其父ID的顺序。此作业的性质是什么。这部分,列出节点=对象。其中x=>x.ParentID==parent.ToList;,感觉像是严重的作弊…哈哈。有些人喜欢用句号:新字符串“.”,5*级自从我第一次上大学用Fortran/Pascal课程以来,我已经用打孔卡片写了几百次了。我只会用制表符“新字符串”\t“,级?这项作业的性质是什么。这部分,列出节点=对象。其中x=>x.ParentID==parent.ToList;,感觉像是严重的作弊…哈哈。有些人喜欢使用句点:新字符串“.”,5*级自从我第一次上大学用Fortran/Pascal使用穿孔卡片以来,我已经写了几百次这段代码了。我只会使用制表符新字符串“\t”,级?