用迭代实现无限级分类
说起那个无限级分类,相信很多人都知道是什么东西,也曾经做过。我也相信,大家用得最多的实现方式就是做一个递归。
最近我也要做一个带无限级分类的菜单,但是我又不想用递归来做,所以我需要用其他方式来实现,那就是迭代了。
首先,我需要定义一个实体模型,这举一个省市无限级的例子:
class Loaction { public int ID { get; set; } public int PID { get; set; } public string Name { get; set; } //地方名 public int Level { get; set; } //深度 }
然后写方法,这里需要利用到栈的后进先出的特点:
public static List<Loaction> Soft(List<Loaction> data, int pid) { Stack task = new Stack(); task.Push(pid); List<Loaction> tree = new List<Loaction>(); int level = 0; while (task.Count > 0) { bool flag = false; for (int i = 0; i < data.Count; i++) { var l = data[i]; if (l.PID == pid) { pid = l.ID; task.Push(l.ID); l.Level = level; level++; tree.Add(l); data.Remove(l); i--; flag=true; } } if (!flag) { task.Pop(); if (task.Count > 0) { pid = Convert.ToInt32(task.Peek()); level--; } } } return tree; }
最后准备数据->调用->输出:
static void Main(string[] args) { var data = new List<Loaction>(); data.Add(new Loaction() { ID = 1, PID = 0, Name = "北京" }); data.Add(new Loaction() { ID = 2, PID = 0, Name = "广东" }); data.Add(new Loaction() { ID = 3, PID = 0, Name = "上海" }); data.Add(new Loaction() { ID = 4, PID = 0, Name = "重庆" }); data.Add(new Loaction() { ID = 5, PID = 0, Name = "黑龙江" }); data.Add(new Loaction() { ID = 6, PID = 1, Name = "丰台" }); data.Add(new Loaction() { ID = 7, PID = 1, Name = "海淀" }); data.Add(new Loaction() { ID = 8, PID = 1, Name = "石景山" }); data.Add(new Loaction() { ID = 9, PID = 3, Name = "上海市" }); data.Add(new Loaction() { ID = 10, PID = 2, Name = "广州" }); data.Add(new Loaction() { ID = 11, PID = 5, Name = "齐齐哈尔" }); data.Add(new Loaction() { ID = 12, PID = 2, Name = "茂名" }); data.Add(new Loaction() { ID = 13, PID = 2, Name = "深圳" }); data.Add(new Loaction() { ID = 14, PID = 5, Name = "哈尔滨" }); data.Add(new Loaction() { ID = 15, PID = 4, Name = "重庆市" }); data.Add(new Loaction() { ID = 16, PID = 2, Name = "东莞" }); data.Add(new Loaction() { ID = 17, PID = 2, Name = "中山" }); data.Add(new Loaction() { ID = 18, PID = 16, Name = "厚街镇" }); var tree = Soft(data, 0); foreach (var t in tree) { var sb = new StringBuilder(); for (int i = 0; i < t.Level; i++) { sb.Append(" "); } sb.Append(t.Name); Console.WriteLine(sb.ToString()); } Console.ReadKey(); }
然后效果如下:
就是这个样子。。。。。(END)