tangxu
2024-04-24 1c5fa983ae3506c2edaa88c51a959d46685c1ba1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
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
    {
       
        /// <summary>
        /// 模糊合并时间段
        /// </summary>
        /// <param name="Date"></param>
        /// <returns></returns>
        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;
        }
    }
}