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