I need some help to construct an algorithm in C# that takes a list of time intervals (start, end), find any overlapping time periods and cut them at their start/end. Then it needs to be merged together in "blocks" so that the final time interval is just one period. I'll illustrate it with a drawing.
My code so far. It works great for two time intervals but introducing a third or more, it starts to give strange results :)
// Dummy objects
var d1 = new TimeSlot(DateTime.Parse("2020-05-05 13:00 PM"), DateTime.Parse("2020-05-05 13:30 PM"), "1");
var d3 = new TimeSlot(DateTime.Parse("2020-05-05 13:15 PM"), DateTime.Parse("2020-05-05 13:25 PM"), "2");
var d2 = new TimeSlot(DateTime.Parse("2020-05-05 13:05 PM"), DateTime.Parse("2020-05-05 13:20 PM"), "3");
List<TimeSlot> dates = new List<TimeSlot>();
dates.Add(d1);
dates.Add(d2);
dates.Add(d3);
List<TimeSlot> slicedDates = new List<TimeSlot>();
IEnumerable<TimeSlot> dateContainer = dates;
TimeSlot prev = dateContainer.First();
dateContainer = dateContainer.Skip(1);
foreach (TimeSlot date in dateContainer.OrderBy(x => x.StartDate))
{
var prevStartTime = prev.StartDate;
var prevEndTime = prev.EndDate;
if (date.StartDate < prev.EndDate)
{
TimeSlot leftSlice = new TimeSlot(prevStartTime, date.StartDate, prev.Name);
slicedDates.Add(leftSlice);
}
if (date.EndDate < prevEndTime)
{
TimeSlot middleSlice = new TimeSlot(date.StartDate, date.EndDate, prev.Name + "," + date.Name);
slicedDates.Add(middleSlice);
TimeSlot rightSlice = new TimeSlot(date.EndDate, prevEndTime, prev.Name);
slicedDates.Add(rightSlice);
}
prev = date;
}
And output for the three time intervals which is wrong:
05-05-2020 13:00:00 => 05-05-2020 13:05:00: 1
05-05-2020 13:05:00 => 05-05-2020 13:20:00: 1,3
05-05-2020 13:05:00 => 05-05-2020 13:15:00: 3
05-05-2020 13:20:00 => 05-05-2020 13:30:00: 1
