类似于下面这个代码,为什么最后root有排序好的树菜单,效果类似于递归,但是为什么给okNodes赋的值为什么跑到root里面是因为内存地址一样吗
不懂其中原理啊
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
namespace ConsTest
{
class Program
{
static void Main(string[] args)
{
var datalist = Gtuslk();
var root = datalist.Where(r => r.ParId == 0).ToList();
var okNodes = new List<Useril>();
foreach (var item in root)
{
okNodes.Add(item);
}
var list = datalist.Where(r => r.ParId != 0).ToList();
foreach (var item in list)
{
foreach (var it in okNodes)
{
if (it.Id == item.ParId)
{
var e = new Useril { Id = item.Id, name = item.name, sex = item.sex };
var node = okNodes.First(r => r.Id == it.Id);
if (node.us == null)
node.us = new List<Useril>();
node.us.Add(e);
okNodes.Add(e);
break;
}
}
}
WriteRoot(root,"没有父级");
Console.ReadKey();
}
private static List<Useril> Gtuslk()
{
var us = new List<Useril>() {
new Useril{
Id = 1,
ParId=0,
name = "张三",
sex = "男"
},
new Useril{
Id = 2,
ParId=0,
name = "李四",
sex = "男"
}, new Useril{
Id = 3,
ParId=1,
name = "赵五",
sex = "男"
}, new Useril{
Id = 3,
ParId=1,
name = "六子",
sex = "男"
}, new Useril{
Id = 4,
ParId=2,
name = "格式",
sex = "男"
}, new Useril{
Id = 5,
ParId=3,
name = "好的",
sex = "男"
}, new Useril{
Id = 6,
ParId=5,
name = "函数",
sex = "男"
}
};
return us;
}
private static void WriteRoot(List<Useril> root, string parnm)
{
foreach (var item in root)
{
Console.WriteLine(parnm + "< 是" + item.name + "父级," + item.sex);
if (item.us.Count>0)
WriteRoot(item.us, item.name);
}
}
}
public class Useril
{
public int Id { set; get; }
public int ParId { set; get; }
public string name { set; get; }
public string sex { set; get; }
public List<Useril> us { set; get; }
public Useril()
{
us = new List<Useril>();
}
}
}
用双重循环实现
var list=dataList.Where(r => r.PARID!=1).ToList();
我觉得是这句代码的问题,他获取除了第一层以外的所有子集了。
root已经获取到第一层了,那么,这里应该要写成 r => r.PARID == 2 这样才对吧。。。
我猜测是这样,具体这点信息很难分辨.
GetOrtherAll 方法是什么内容。
只有按 邻接列表算法组织的数据才需要递归
而现在大部分的树都不需要递归了
再说,尾递归必然可以化为循环
所以 GetOrtheTree 方法被设计成非递归是很正常的