public static List<DepartmentFlat> doFlat(IEnumerable<CompanyDepartment> departments) { List<DepartmentFlat> result = new List<DepartmentFlat>(); foreach (var grp in departments.GroupBy(d => d.CompanyId)) { var tree = dbToTree(grp.ToArray()); var path = new Department[DepartmentFlat.maxDeep]; ForEach(tree, 0, path, (pth, lev) => { DepartmentFlat res = new DepartmentFlat(); for (int i = 0; i <= lev; i++) res.setLevel(i, pth[i].Id, pth[i].Title); var fakeId = pth[lev].Id; for (int i = lev + 1; i < DepartmentFlat.maxDeep; i++) res.setLevel(i, fakeId, null); result.Add(res); }); } return result; }
static DepartmentFlat Clone(DepartmentFlat src, long oldId, long userId, string userTitle, int levId, string levTitle, long modId, string modTitle) { var its = new List<DepItem>(); var st = 0; foreach (var it in src.Items) { switch (st) { case 0: its.Add(new DepItem() { Id = -it.Id, Title = it.Title }); if (it.Id == oldId) st = 1; break; //case 1: its.Add(new DepItem() { Id = -it.Id, Title = it.Title }); st = 2; case 1: its.Add(new DepItem() { Id = userId, Title = userTitle }); st = 2; break; case 2: its.Add(new DepItem() { Id = levId, Title = levTitle }); st = 3; break; case 3: its.Add(new DepItem() { Id = modId, Title = modTitle }); st = 4; break; case 4: its.Add(new DepItem() { Id = modId, Title = null }); break; } } return new DepartmentFlat() { Items = its.ToArray() }; }