合并重叠时间段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