合并重叠时间段C#

1、实际业务中,存在以下使用场景:

不同的开始、结束时间,需要合并其中的重叠部分。

例如:

StartTime EndTime
06:10:58 08:15:28
07:38:56 10:34:45
10:55:00 11:34:00
13:09:34 17:45:23
14:23:12 15:24:14
16:14:25 17:52:15
...
合并后为:
StartTime EndTime
06:10:58 10:34:45
10:55:00 11:34:00
13:09:34 17:52:15
...

2、查阅资料,找到如下处理办法(C#):

 

首先把数据读入DataTable dt里,然后

 static void CombineData()
        {
            DataTable dt = new DataTable();
            dt.Columns.Add(new DataColumn("StartTime", Type.GetType("System.DateTime")));
            dt.Columns.Add(new DataColumn("EndTime", Type.GetType("System.DateTime")));

            DataRow row = dt.NewRow();
            row[0] = DateTime.Parse("06:10:58");
            row[1] = DateTime.Parse("08:15:28");
            dt.Rows.Add(row);

            row = dt.NewRow();
            row[0] = DateTime.Parse("07:38:56");
            row[1] = DateTime.Parse("10:34:45");
            dt.Rows.Add(row);

            row = dt.NewRow();
            row[0] = DateTime.Parse("10:55:00");
            row[1] = DateTime.Parse("11:34:00");
            dt.Rows.Add(row);

            row = dt.NewRow();
            row[0] = DateTime.Parse("13:09:34");
            row[1] = DateTime.Parse("17:45:23");
            dt.Rows.Add(row);

            row = dt.NewRow();
            row[0] = DateTime.Parse("14:23:12");
            row[1] = DateTime.Parse("15:24:14");
            dt.Rows.Add(row);

            row = dt.NewRow();
            row[0] = DateTime.Parse("16:14:25");
            row[1] = DateTime.Parse("17:52:15");
            dt.Rows.Add(row);

            for (int i = dt.Rows.Count - 1; i >= 1; i--)
            {
                //从后往前判断
                if (Convert.ToDateTime(dt.Rows[i - 1]["EndTime"].ToString()) > Convert.ToDateTime(dt.Rows[i]["StartTime"].ToString()) && Convert.ToDateTime(dt.Rows[i - 1]["EndTime"].ToString()) < Convert.ToDateTime(dt.Rows[i]["EndTime"].ToString()))
                {
                    dt.Rows[i - 1]["EndTime"] = dt.Rows[i]["EndTime"];
                    dt.Rows.RemoveAt(i);
                }
                else if (Convert.ToDateTime(dt.Rows[i - 1]["EndTime"].ToString()) > Convert.ToDateTime(dt.Rows[i]["StartTime"].ToString()) && Convert.ToDateTime(dt.Rows[i - 1]["EndTime"].ToString()) > Convert.ToDateTime(dt.Rows[i]["EndTime"].ToString()))
                {
                    dt.Rows.RemoveAt(i);
                    i++;
                }
            }

            foreach (DataRow r in dt.Rows)
            {
                Console.WriteLine(r[0].ToString()+" "+r[1].ToString());
            }
            Console.ReadLine();
        }

 3、参考资料

http://bbs.csdn.net/topics/360064136

http://blog.csdn.net/hcw_peter/article/details/3980723

转载于:https://www.cnblogs.com/panxiaoming/p/6725348.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!针对您的问题,我可以给您提供一些思路和代码实现。 首先,对于合并重叠时间段的问题,可以使用以下思路: 1. 将时间段按照起始时间排序; 2. 遍历时间段,如果当前时间段与前一个时间段重叠,则将其合并为一个时间段,否则将当前时间段添加到结果列表中。 具体实现可以参考以下代码: ```csharp public static List<(DateTime start, DateTime end)> MergeOverlapIntervals(List<(DateTime start, DateTime end)> intervals) { // 将时间段按照起始时间排序 intervals = intervals.OrderBy(x => x.start).ToList(); var mergedIntervals = new List<(DateTime start, DateTime end)>(); var currentInterval = intervals[0]; for (int i = 1; i < intervals.Count; i++) { var interval = intervals[i]; // 如果当前时间段与前一个时间段重叠,则将其合并为一个时间段 if (currentInterval.end >= interval.start) { currentInterval = (currentInterval.start, interval.end); } else { // 否则将当前时间段添加到结果列表中 mergedIntervals.Add(currentInterval); currentInterval = interval; } } // 添加最后一个时间段 mergedIntervals.Add(currentInterval); return mergedIntervals; } ``` 接下来,对于重叠日期按照优先级合并的问题,可以使用以下思路: 1. 将时间段按照起始时间排序; 2. 遍历时间段,如果当前时间段与前一个时间段重叠并且优先级高于前一个时间段,则将其合并为一个时间段,否则将当前时间段添加到结果列表中。 具体实现可以参考以下代码: ```csharp public static List<(DateTime start, DateTime end, int priority)> MergeOverlapIntervalsWithPriority(List<(DateTime start, DateTime end, int priority)> intervals) { // 将时间段按照起始时间排序 intervals = intervals.OrderBy(x => x.start).ToList(); var mergedIntervals = new List<(DateTime start, DateTime end, int priority)>(); var currentInterval = intervals[0]; for (int i = 1; i < intervals.Count; i++) { var interval = intervals[i]; // 如果当前时间段与前一个时间段重叠并且优先级高于前一个时间段,则将其合并为一个时间段 if (currentInterval.end >= interval.start && currentInterval.priority <= interval.priority) { currentInterval = (currentInterval.start, interval.end, interval.priority); } else { // 否则将当前时间段添加到结果列表中 mergedIntervals.Add(currentInterval); currentInterval = interval; } } // 添加最后一个时间段 mergedIntervals.Add(currentInterval); return mergedIntervals; } ``` 希望以上代码可以对您有所帮助!如果您还有其他问题,欢迎继续提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值