已经迁到自己的博客,有兴趣的读者请移步到(http://jhonge.net),谢谢各位支持。

用迭代实现无限级分类

说起那个无限级分类,相信很多人都知道是什么东西,也曾经做过。我也相信,大家用得最多的实现方式就是做一个递归。

最近我也要做一个带无限级分类的菜单,但是我又不想用递归来做,所以我需要用其他方式来实现,那就是迭代了。

首先,我需要定义一个实体模型,这举一个省市无限级的例子:

    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)

 

posted @   小蝶惊鸿  阅读(794)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 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)
点击右上角即可分享
微信分享提示