如题所示,datatable中有两列(id,pid),假如有条数据的id等于另一条数据的pid,那么他俩就有父子关系了。数据大致两百条,有多少层未知,现有个类
public class Text { public Text Parent{get;set;} public List<Text> Children{get;set;} public Text() { this. Children=new List<Text>(); } }
希望是存放在一个List<Text>里面
现在本人用递归,发觉复杂度有点高。
解决方案
40
static void Main(string[] args) { //构造一个 DataTable var dt = new DataTable(); dt.Columns.Add(new DataColumn("id", typeof(int))); dt.Columns.Add(new DataColumn("pid", typeof(int))); dt.Rows.Add(1, 0); dt.Rows.Add(2, 0); dt.Rows.Add(3, 1); dt.Rows.Add(4, 2); dt.Rows.Add(5, 3); //从 DataTable 生成 List<Text> var res = (from x in dt.AsEnumerable() select new Text((int)x["id"], (int)x["pid"])).ToList(); //匹配父子关系 foreach (var x in res) x.Children = res.FindAll(n => n.Pid == x.Id); //打印一下 foreach (var x in res) see(x); Console.ReadKey(); } //生成不需要递归,访问却是要递归的 static void see(Text a, int n=0) { Console.WriteLine("{0,"+n+"}id:{1} pid:{2}", "", a.Id, a.Pid); foreach (var x in a.Children) see(x, n + 4); } public class Text { public Text Parent { get; set; } public List<Text> Children { get; set; } public int Id = 0; public int Pid = 0; public Text(int id, int pid) { Id = id; Pid = pid; this.Children = new List<Text>(); } }