privatestatic List<dynamic> GetAreaList(List<QR_Area> areaList, int type, string code = "86") { var list = new List<dynamic>(); var l = areaList.Where(a => (int)a.RealAreaType == type && (a.SortCode.StartsWith(code) || code == "86") && !string.IsNullOrWhiteSpace(a.Name)). Select(a => new { value = a.SortCode, label = a.Name, children = GetAreaList(areaList, type + 1, a.SortCode) }).ToList();
if (l.Count > 0) { if (code == "6101") { l = l.Where(a => !a.value.StartsWith("610194")).ToList(); } list.AddRange(l); } else { list = null; } return list; }
组织
构建组织
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
privatestaticdynamicConstructContractor(List<SimpleContractor> list) { if (list == null || list.Count == 0) returnnull; var l = list; var top = l[0]; if (l.Count > 1) { l.RemoveAt(0); var groups = l.GroupBy(c => c.C.Substring(0, top.C.Length + 4)); returnnew { Code = top.C, Name = top.N, Children = groups.Select(g => { var sub = g.ToList().OrderBy(c => c.C.Length).OrderBy(c => c.C).ToList(); if (sub[0].C.Length > top.C.Length + 4) returnnull; return ConstructContractor(sub); }).Where(x => x != null).ToList() }; } returnnew { Code = top.C, Name = top.N }; }
获取组织
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
privatestaticdynamicGetContractor(dynamic contractor, string code) { if (contractor.Code.Equals(code)) return contractor;
if (code.StartsWith(contractor.Code)) { if (contractor.Children != null && contractor.Children.Count > 0) { for (var i = 0; i < contractor.Children.Count; i++) { var result = GetContractor(contractor.Children[i], code); if (result != null) return result; } } }
funcfindDepth(s string)int { var current int = 0 var max int = 0
b := []byte(s) for i := 0; i < len(b); i++ { x := b[i] if x == '(' { current += 1 if current > max { max = current } } if x == ')' && current > 0 { current -= 1 } }
funcgetKMax(s []int, k int)int { if k < 1 || len(s) < k { return-1 }
//将前k个数构建最小堆 constructMinHeap(s, k)
//将k以后的数与s[0]进行比较 //若比s[0]大, 则与s[0]交换, 并自顶向下重构最小堆 for i := k; i < len(s); i++ { if s[i] <= s[0] { continue }
s[0], s[i] = s[i], s[0]
x := 0 for x < k { x = reConstructMinHeap(s, k, x) } }
return s[0] }
funcreConstructMinHeap(s []int, k int, current int)int { //将current与 left=2*current+1 right=2*current+2 中最小的进行比较, 若current较大,则进行交换 left := 2*current + 1 if left < k { minIndex := left right := 2*current + 2 if right < k && s[right] < s[left] { minIndex = right } if s[minIndex] < s[current] { s[current], s[minIndex] = s[minIndex], s[current] return minIndex } }
return k }
funcconstructMinHeap(s []int, k int) { for i := k - 1; i > 0; i = i - 2 { parent := (i - 1) / 2 left := 2*parent + 1 right := 2*parent + 2 minIndex := left if right < k && s[right] < s[left] { minIndex = right } if s[parent] > s[minIndex] { s[parent], s[minIndex] = s[minIndex], s[parent] } } }