using System.Collections.Generic;
public static void Main()
public static void Scenario1()
var reservations = new[]{
new Reservation(TimeSpan.FromHours(9), TimeSpan.FromHours(12)),
new Reservation(TimeSpan.FromHours(10), TimeSpan.FromHours(12)),
new Reservation(TimeSpan.FromHours(11), TimeSpan.FromHours(12)),
new Reservation(TimeSpan.FromHours(13), TimeSpan.FromHours(14))
var startTimes = reservations.GroupBy(x => x.StartTime).ToDictionary(k => k.Key, v => v.Count());
var endTimes = reservations.GroupBy(x => x.EndTime).ToDictionary(k => k.Key, v => v.Count());
var dayStart = TimeSpan.FromHours(8);
var dayEnd = TimeSpan.FromHours(18);
var result = new List<TimeLineItem>();
var currentStart = dayStart;
for(var time = dayStart; time<= dayEnd;time = time.Add(TimeSpan.FromMinutes(1)))
if(startTimes.TryGetValue(time, out var numStart))
result.Add(CreateItem(currentStart, time, currentCount));
currentCount += numStart;
if(endTimes.TryGetValue(time, out var numEnd))
result.Add(CreateItem(currentStart, time, currentCount));
result.Add(CreateItem(currentStart, dayEnd, currentCount));
foreach(var item in result)
Console.WriteLine($"{item.ItemTimeText} ({item.ItemColor})");
private static TimeLineItem CreateItem(TimeSpan start, TimeSpan end, int count)
return new TimeLineItem(color, $"{start} - {end}");
public TimeSpan StartTime { get; set; }
public TimeSpan EndTime { get; set; }
public Reservation(TimeSpan startTime, TimeSpan endTime)
public class TimeLineItem
public Color ItemColor { get; set; }
public string ItemTimeText { get; set; }
public TimeLineItem(Color itemColor, string itemTimeText)
ItemTimeText = itemTimeText;