/// <summary> /// 根据事件发生的频率进行分组,并以事件频率作为偏序关系进行升序排序, /// 产生一个与 IGrouping<BigInteger, StatistTotalByDateTime> 为单元的有序列表 /// </summary> /// <returns></returns> public TioSalamanca[] GroupDateTimesByTotal() { IOrderedEnumerable <IGrouping <BigInteger, StatistTotalByDateTime> > groupingForTotal = from e in _entries group e.Value by e.Value.Total into newgroup orderby newgroup.Key select newgroup; #if DEBUG Debug.WriteLine("Executing GroupDateTimesByDiff..."); foreach (var item in groupingForTotal) { Debug.WriteLine(item.Key); foreach (var subitem in item) { Debug.WriteLine($" {subitem}"); } } #endif // 一个级别有若干个Key;一个Key有若干条记录 // levelByTotal 指示每个级别有多少个 Key(groupingForTotal根据Total分组出来的Key) TioSalamanca levels = null; // groups 代表 dateTimes 根据每个元素的 Total 分组之后 groups(item.Key) 的总数 BigInteger groups = groupingForTotal.LongCount(); if (groups > 5) { // keysForEachLevel 表示每个级别应包含多少个 item.Key BigInteger keysForEachLevel = groups / 5; BigInteger remain = groups % 5; #if DEBUG Debug.WriteLine($"groups: {groups}"); Debug.WriteLine($"keysForEachLevel: {keysForEachLevel}"); Debug.WriteLine($"remain: {remain}"); #endif TioSalamanca[] entries = new TioSalamanca[5]; BigInteger keyIncre = 0; // entriesIncre 没有必要使用 BigInteger,因为不管有多少个 Key,分成多少个 group, // entries 的长度永远为 5,因为纪录器最多只能分五级 int entriesIncre = 0; foreach (var item in groupingForTotal) { keyIncre += 1; if (keyIncre == keysForEachLevel) { if (entriesIncre < entries.Length - 1) { keyIncre = 0; levels.Add(item); entries[entriesIncre] = levels; entriesIncre += 1; levels = null; } else if (entriesIncre == entries.Length - 1) { if (remain != 0) { levels.Add(item); } // 这么做迫使下次循环 keyIncre 仍然为 5, // 这样能再次进入 keyIncre == keysForEachLevel 语句块; keyIncre -= 1; } } else if (levels == null) { levels = new TioSalamanca { item }; } else { levels.Add(item); } } entries[entriesIncre] = levels; return(entries); } else if (groups <= 5 && groups > 0) { TioSalamanca[] entries = new TioSalamanca[groups.BigIntegerToInt32()]; TioSalamanca temp = groupingForTotal.ToList(); for (int i = 0; i < entries.Length; i++) { entries[i] = new TioSalamanca(1) { temp[i] }; } return(entries); } else { throw new InvalidOperationException($"Unkown error. Groups is {groups}"); } }