用迭代实现无限级分类
说起那个无限级分类,相信很多人都知道是什么东西,也曾经做过。我也相信,大家用得最多的实现方式就是做一个递归。
最近我也要做一个带无限级分类的菜单,但是我又不想用递归来做,所以我需要用其他方式来实现,那就是迭代了。
首先,我需要定义一个实体模型,这举一个省市无限级的例子:
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)
标签:
个人笔记
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
2013-03-24 初识Entity Framework CodeFirst(2)
2013-03-24 初识Entity Framework CodeFirst(1)