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