using IStation.Model; using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; namespace IStation.WinFrmUI.Monitor { public class HistoryDataAPiHelper { /// /// 模糊合并时间段 /// /// /// public List<(DateTime, DateTime, int, double, double, double)> MergeTimeSlots(List<(DateTime, DateTime, double, double, double)> Date) { if(Date==null) return null; List<(DateTime, DateTime, int, double, double, double)> mergedSlots = new List<(DateTime, DateTime, int, double, double, double)>(); // 初始化合并后的列表 Date.Sort((x, y) => x.Item2.CompareTo(y.Item2)); // 按照起始时间排序 if (Date.Count==0) return null; DateTime mergedStart = Date[0].Item1; DateTime mergedEnd = Date[0].Item2; int mergeCount = 1; double mergedDoubleELePrice = Date[0].Item3; // 电费 double mergedDoubleWater = Date[0].Item4; // 取水量 double mergedDoubleEle = Date[0].Item5; // 用电量 // 从第二个时间段开始迭代 for (int i = 1; i < Date.Count; i++) { DateTime start = Date[i].Item1; DateTime end = Date[i].Item2; double currentDouble1 = Date[i].Item3; double currentDouble2 = Date[i].Item4; double currentDouble3 = Date[i].Item5; // 如果当前时间段与合并时间段有重叠,则合并 if (start <= mergedStart.AddMinutes(30) && start >= mergedStart.AddMinutes(-30) && end <= mergedEnd.AddMinutes(30) && end >= mergedEnd.AddMinutes(-30)) { mergedStart = DateTime.Compare(mergedStart, start) < 0 ? mergedStart : start; mergedEnd = DateTime.Compare(mergedEnd, end) < 0 ? end : mergedEnd; mergeCount++; mergedDoubleELePrice += currentDouble1; mergedDoubleWater += currentDouble2; mergedDoubleEle += currentDouble3; } else { // 将已合并的时间段添加到列表中 mergedSlots.Add((mergedStart, mergedEnd, mergeCount, mergedDoubleELePrice, mergedDoubleWater, mergedDoubleEle)); // 更新合并时间段和 double 字段为当前时间段的值 mergedStart = start; mergedEnd = end; mergeCount = 1; mergedDoubleELePrice = currentDouble1; mergedDoubleWater = currentDouble2; mergedDoubleEle = currentDouble3; } } // 添加最后一个时间段 mergedSlots.Add((mergedStart, mergedEnd, mergeCount, mergedDoubleELePrice, mergedDoubleWater, mergedDoubleEle)); return mergedSlots; } } }