using System.Diagnostics.CodeAnalysis;
struct Interval<T> : IComparable<Interval<T>>
public DateTime Start { get; set; }
public DateTime End { get; set; }
public T Data { get; set; }
public int CompareTo([AllowNull] Interval<T> other)
=> Start.CompareTo(other.Start);
public override string ToString()
=> $"Interval(S={Start:yyMMdd-HHmm}, E={End:yyMMdd-HHmm}, D={Data})";
static readonly DateTime TimeX = new DateTime(2020, 10, 22, 16, 00, 00);
static readonly TimeSpan Hour1 = TimeSpan.FromHours(1);
static readonly TimeSpan Hours2 = TimeSpan.FromHours(2);
static void Main(string[] args)
var map = new IntervalTree<DateTime, Interval<string>>();
var shift3 = new Interval<string>
End = TimeX + 4 * Hours2,
map.Add(shift3.Start, shift3.End, shift3);
var shift2 = new Interval<string>
End = TimeX + 3 * Hours2,
map.Add(shift2.Start, shift2.End, shift2);
var shift1 = new Interval<string>
Start = TimeX + 2 * Hours2,
End = TimeX + 5 * Hours2,
map.Add(shift1.Start, shift1.End, shift1);
Console.WriteLine("All Datas");
Console.WriteLine($"{d.Value}");
Console.WriteLine("\nQuery at 17:00");
foreach (var d in map.Query(TimeX + Hour1))
Console.WriteLine($"{d}");
Console.WriteLine("\nQuery at 19:00");
foreach (var d in map.Query(TimeX + 3 * Hour1))
Console.WriteLine($"{d}");
Console.WriteLine("\nQuery at 21:00");
foreach (var d in map.Query(TimeX + 5 * Hour1))
Console.WriteLine($"{d}");
Console.WriteLine("\nQuery at 23:00");
foreach (var d in map.Query(TimeX + 7 * Hour1))
Console.WriteLine($"{d}");