public static intersections intersects(TimeSlotModel a, TimeSlotModel b) { if (a.start == a.end() || b.start == b.end()) { return(intersections.No_Intersect); } if (a.start <= b.start) { if (a.end() >= b.start && a.end() <= b.end()) { return(intersections.A_Before_B); } if (a.end() >= b.end()) { return(intersections.B_inside_A); } } else { if (b.end() >= a.start && b.end() <= a.end()) { return(intersections.B_Before_A); } if (b.end() >= a.end()) { return(intersections.A_inside_B); } } return(intersections.No_Intersect); }
public void consolidateEvents() { while (startDate.Date < endDate.Date) { Console.WriteLine(startDate.ToString()); addEvent(new UserEventModel { timeSlot = new TimeSlotModel { start = startDate, length = dayStart }, name = "Null", userId = "6f2241ae-da64-4aa8-a414-308d8f900057", meetingId = "6f2241ae-da64-4aa8-a414-308d8f900057" }); var endLen = startDate.AddDays(1).Subtract(startDate.Add(dayEnd)); addEvent(new UserEventModel { timeSlot = new TimeSlotModel { start = startDate.Add(dayEnd), length = new TimeSpan(endLen.Hours, endLen.Minutes, endLen.Seconds) }, name = "Null", userId = "6f2241ae-da64-4aa8-a414-308d8f900057", meetingId = "6f2241ae-da64-4aa8-a414-308d8f900057" }); startDate = startDate.AddDays(1); } var tempEvents = (events.OrderByDescending(x => x.timeSlot.start) .Select(x => x.timeSlot).ToList()); /*foreach(TimeSlotModel t in tempEvents) * { * if (t.start.TimeOfDay < dayStart) * { * t.start = t.start.Date.Add(dayStart); * } * if (t.end().TimeOfDay > dayEnd) * { * t.length = t.length - (t.end().TimeOfDay - dayEnd); * } * }*/ tempEvents.Reverse(); bool delta = true; while (delta) { consolidatedEvents.Clear(); consolidatedEvents.AddRange(tempEvents); tempEvents.Clear(); delta = false; for (int i = 0; i < consolidatedEvents.Count; i++) { var thisEvent = consolidatedEvents[i]; Console.WriteLine(thisEvent.ToString()); var nextEvent = i + 1 != consolidatedEvents.Count ? consolidatedEvents[i + 1] : null; if (nextEvent != null) { var intersect = TimeSlotModel.intersects(thisEvent, nextEvent); switch (intersect) { case TimeSlotModel.intersections.A_Before_B: Console.WriteLine("A BEFORE B"); thisEvent.length = nextEvent.end() - thisEvent.start; tempEvents.Add(thisEvent); i++; //Skip nextevent delta = true; break; case TimeSlotModel.intersections.A_inside_B: Console.WriteLine("A INSIDE B"); tempEvents.Add(nextEvent); i++; delta = true; break; case TimeSlotModel.intersections.B_Before_A: Console.WriteLine("B BEFORE A"); thisEvent.length = thisEvent.end() - nextEvent.start; thisEvent.start = nextEvent.start; tempEvents.Add(thisEvent); i++; //Skip nextevent delta = true; break; case TimeSlotModel.intersections.B_inside_A: Console.WriteLine("B INSIDE A"); tempEvents.Add(thisEvent); i++; delta = true; break; case TimeSlotModel.intersections.No_Intersect: Console.WriteLine("NO INTERSECT"); tempEvents.Add(thisEvent); break; } } else if (thisEvent != null) { tempEvents.Add(thisEvent); } } } createGaps(); }