用迭代實現無限級分類

来源:http://www.cnblogs.com/shouce/archive/2016/03/31/5339783.html
-Advertisement-
Play Games

說起那個無限級分類,相信很多人都知道是什麼東西,也曾經做過。我也相信,大家用得最多的實現方式就是做一個遞歸。 最近我也要做一個帶無限級分類的菜單,但是我又不想用遞歸來做,所以我需要用其他方式來實現,那就是迭代了。 首先,我需要定義一個實體模型,這舉一個省市無限級的例子: class Loaction ...


說起那個無限級分類,相信很多人都知道是什麼東西,也曾經做過。我也相信,大家用得最多的實現方式就是做一個遞歸。

最近我也要做一個帶無限級分類的菜單,但是我又不想用遞歸來做,所以我需要用其他方式來實現,那就是迭代了。

首先,我需要定義一個實體模型,這舉一個省市無限級的例子:

複製代碼
    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)

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 雖然ubuntu的中國伺服器的速度已經非常不錯,但是難免,會有網路不暢的情形,所以修改軟體源地址是一個基礎的知識點。 修改ubuntu的軟體源的方式有多種,一直是通過ubuntu軟體中心提供的UI,還有一種就是通過編輯/etc/apt/sources.list配置文件。 UI操作 通過軟體中心配置軟... ...
  • SCCM 部署操作系統 ,提示許可權問題,報錯:0xc00000098 這個問題通過查看日誌,論壇搜索,博客等。下麵是最終的解決方法: 1.檢查所有組件是否已安裝。(IIS組件等)。(分發站點證書是否正常) 2.在分發點將PEX鉤去掉。 3.卸載WDS重啟SCCM伺服器。 4.卸載管理組件。 5.卸載 ...
  • 自從甲骨文收購 MySQL 後,由於甲骨文對 MySQL 的開發和維護更多傾向於閉門的立場,很多 MySQL 的開發者和用戶放棄了它。在社區驅動下,促使更多人移到 MySQL 的另一個叫 MariaDB 的分支,在原有 MySQL 開發人員的帶領下,MariaDB 的開發遵循開源的理念,並確保它的二 ...
  • 之前的折騰過Windows下ssh的自動登錄,比如這篇Windows下使用Xshell建立反向隧道,但是這個不能無交互的情況下自動連接(比如在連接新主機時),也就很難在服務中使用。解決方法還是得使用命令行版本。 OpenSSH其實是有Windows版本的,並且目前還在維護:https://githu ...
  • 我們知道VMware的網路適配器類型有多種,例如E1000、VMXNET、VMXNET 2 (Enhanced)、VMXNET3等,就性能而言,一般VMXNET3要優於E1000,下麵介紹如果將Linux虛擬機的網路適配器類型從E1000改為VMXNET3。本文測試環境如下 操作系統 :Oracle... ...
  • 顯示層面頭文件 定義結構體,為顯示統一標準 int (*DeviceInit)(void); 顯示類驅動初始化 int (*ShowPixel)(int iPenX, int iPenY, unsigned int dwColor); 對某一點進行瞄色 int (*CleanScreen)(unsi... ...
  • 先寫一個完善的電子書框架,完善之前寫的功能拼接到一塊,實現多種文本文件格式打開解碼顯示, 多種字體顯示,設置文字大小,將以前混亂的程式按塊封裝 ...
  • 1、為什麼需要擴展方法 .NET3.5給我們提供了擴展方法的概念,它的功能是在不修改要添加類型的原有結構時,允許你為類或結構添加新方法。 思考:那麼究竟為什麼需要擴展方法呢,為什麼不直接修改原有類型呢? 首先,假設我們的項目中有一個類,後來過了一段時間,我們明確的知道需要為該類添加一個新功能,考慮這 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...