C#通用遞歸生成樹形結構數據


1.首先定義樹形結構類

        /// <summary>
        /// 構建樹形結構類
        /// </summary>
        public class TreeModel
        {
            public string ID { set; get; }
            public string PARENTID { set; get; }
            public string NAME { set; get; }
            public List<TreeModel> TREECHILDREN { set; get; }
        }

2.利用反射將泛型list轉換為樹形結構類

      /// <summary>
        /// 公用遞歸(反射轉換List)
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="allList">數據列表</param>
        /// <param name="parentId">父級ID</param>
        /// <param name="idField">id字段名稱</param>
        /// <param name="parentIdField">父級id字段名稱</param>
        /// <param name="nameField">name字段名稱</param>
        /// <returns></returns>
        public List<TreeModel> ConversionList<T>(List<T> allList, string parentId, string idField, string parentIdField, string nameField)
        {
            List<TreeModel> list = new List<TreeModel>();
            TreeModel model = null;
            foreach (var item in allList)
            {
                model = new TreeModel();
                foreach (System.Reflection.PropertyInfo p in item.GetType().GetProperties())
                {
                    if (p.Name == idField)
                    {
                        model.ID = p.GetValue(item).ToString();
                    }
                    if (p.Name == parentIdField)
                    {
                        model.PARENTID = p.GetValue(item).ToString();
                    }
                    if (p.Name == nameField)
                    {
                        model.NAME = p.GetValue(item).ToString();
                    }
                }
                list.Add(model);
            }
            return OperationParentData(list, parentId);
        }

3.遞歸方法

     /// <summary>
        /// 公用遞歸(處理遞歸最父級數據)
        /// </summary>
        /// <param name="treeDataList">樹形列表數據</param>
        /// <param name="parentId">父級Id</param>
        /// <returns></returns>
        public List<TreeModel> OperationParentData(List<TreeModel> treeDataList, string parentId)
        {
            var data = treeDataList.Where(x => x.PARENTID == parentId);
            List<TreeModel> list = new List<TreeModel>();
            foreach (var item in data)
            {
                OperationChildData(treeDataList, item);
                list.Add(item);
            }
            return list;
        }
        /// <summary>
        /// 公用遞歸(遞歸子級數據)
        /// </summary>
        /// <param name="treeDataList">樹形列表數據</param>
        /// <param name="parentItem">父級model</param>
        public void OperationChildData(List<TreeModel> treeDataList, TreeModel parentItem)
        {
            var subItems = treeDataList.Where(ee => ee.PARENTID == parentItem.ID).ToList();
            if (subItems.Count != 0)
            {
                parentItem.TREECHILDREN = new List<TreeModel>();
                parentItem.TREECHILDREN.AddRange(subItems);
                foreach (var subItem in subItems)
                {
                    OperationChildData(treeDataList, subItem);
                }
            }
        }

4.調用

List<TreeModel> treeViewModels = new List<TreeModel>();
//list為待處理數據集,pID為父級節點ID;然后分別傳入待處理數據集中ID的字段名稱,父級ID的字段名稱和需要展示Name字段名稱
treeViewModels
= ConversionList(list, pID, "ID", "PID", "EFName");

5.處理后數據結果

[{
        "ID": "00000000-0000-0000-0000-000000000001",
        "PARENTID": "00000000-0000-0000-0000-000000000000",
        "NAME": "1級",
        "TREECHILDREN": [{
            "ID": "00000000-0000-0000-0000-000000000002",
            "PARENTID": "00000000-0000-0000-0000-000000000001",
            "NAME": "2級",
            "TREECHILDREN": [{
                "ID": "00000000-0000-0000-0000-000000000003",
                "PARENTID": "00000000-0000-0000-0000-000000000002",
                "NAME": "3級",
                "TREECHILDREN": [{
                    "ID": "00000000-0000-0000-0000-000000000005",
                    "PARENTID": "00000000-0000-0000-0000-000000000003",
                    "NAME": "4級",
                    "TREECHILDREN": null
                }]
            }]
        }]
    },
    {
        "ID": "00000000-0000-0000-0000-000000000004",
        "PARENTID": "00000000-0000-0000-0000-000000000000",
        "NAME": "1級",
        "TREECHILDREN": null
    }
]

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM