同一天中的一连串不连续时间段,合并其中重叠时间,如:
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
...
时间复杂度尽量避免n^2的情况,即集合内任一元素与其他元素各比较一次
你是问SQL语句还是C#代码,你上面的那些数据放在哪儿?
参考:
public class bw22617
{
private List<Betime> timeList = new List<Betime>() {
new Betime{BeginTime=new DateTime(2011,3,1,6,10,58),EndTime=new DateTime(2011,3,1,8,15,28)},
new Betime{BeginTime=new DateTime(2011,3,1,7,38,56),EndTime=new DateTime(2011,3,1,10,34,45)},
new Betime{BeginTime=new DateTime(2011,3,1,10,55,0),EndTime=new DateTime(2011,3,1,11,34,0)},
new Betime{BeginTime=new DateTime(2011,3,1,13,9,34),EndTime=new DateTime(2011,3,1,17,45,23)},
new Betime{BeginTime=new DateTime(2011,3,1,14,23,12),EndTime=new DateTime(2011,3,1,15,24,14)},
new Betime{BeginTime=new DateTime(2011,3,1,16,14,25),EndTime=new DateTime(2011,3,1,17,52,15)}
};
public void Union()
{
for (int i = 0; i < timeList.Count-1;i++ )
{
int j=i+1;
if (timeList[i].EndTime >= timeList[j].BeginTime)
{
if (timeList[i].EndTime >= timeList[j].EndTime)
{
timeList[j] = timeList[i];
}
else
{
timeList[j].BeginTime = timeList[i].BeginTime;
}
timeList[i] = null;
}
else
{
i++;
}
}
timeList.ForEach(
delegate(Betime p)
{
if (p != null)
{
Console.WriteLine("BeginTime: "+p.BeginTime+"\tEndTime: "+p.EndTime);
}
}
);
}
}
public class Betime
{
public DateTime BeginTime { get; set; }
public DateTime EndTime { get; set; }
}
结果:
虽然功能实现得还是不错的,不过个人感觉欠考虑,不是效率问题,而是准确度问题。比方说,后面一行记录的结束时间如果也小于前面一行记录,那么结束时间就不应该继续拿后面一行记录了。如果List内的数据未经过排序,那么这样做肯定得不到想要的结果。鉴于数据一般优先加载到DataTable中,在DataTable中使用筛选更加好。