記一則 Lambda內遞歸調用方法將集合對象轉換成樹形結構

 public dynamic GetDepartments(string labID)
        {
            List<int> usedIDs = new List<int>(); //緩存已用過的ID

            //定義遞歸算法
            Func<object,List<DepartmentItem>, List<DepartmentItem>, dynamic> recursion = (r,d,a) =>
            {
                List<dynamic> dyData = new List<dynamic>();
                if (d.Count > 0)
                {
                    d.ForEach(x =>
                    {
                        if (!usedIDs.Contains(x.DepartmentID))
                        {
                            dynamic department = new ExpandoObject();
                            department.DepartmentID = x.DepartmentID;
                            department.DepartmentName = x.DepartmentName;
                            department.DepartmentDesc = x.DepartmentDesc;
                            department.CreateTime = x.CreateTime;
                            department.ParentDepartmentID = x.ParentDepartmentID;
                            usedIDs.Add(x.DepartmentID);
                           // department.children = recursion(r, d, a); 這裏直接調用的話會提示未定義變量,因爲func的定義還沒結束..
                           // 所以用以下的方法:調用的時候用object把方法傳進來,然後轉換下再調用執行;
                            var func_recursion = r as Func<object, List<DepartmentItem>, List<DepartmentItem>, dynamic>;
                            department.children = func_recursion(r, a.Where(w => w.ParentDepartmentID == x.DepartmentID).ToList(), a);
                            dyData.Add(department);
                        }
                    });
                }

                return dyData;
            };
            var departments =.....//獲取集合數據;

            //調用方法
            //這裏第一個參數就是方法的本身,傳遞進去進行遞歸調用
            var result = recursion(recursion, departments, departments);

            return result;

        }

  代碼是將集合對象轉換成樹形結構

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章