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; }
代碼是將集合對象轉換成樹形結構算法