using System.Collections.Generic;
public class DatetimeInterval
public DateTime From { get; set; }
public DateTime To { get; set; }
public DatetimeInterval(DateTime from, DateTime to)
public class OverlapComparer : EqualityComparer<DatetimeInterval>
public override bool Equals(DatetimeInterval oldRegistation, DatetimeInterval newRegistration)
return oldRegistation.From >= newRegistration.To && oldRegistation.To <= newRegistration.From;
public override int GetHashCode(DatetimeInterval obj)
return obj.GetHashCode();
public static void Main()
var start0A = new DateTime(2008, 5, 1, 8, 30, 52);
var end0A = new DateTime(2012, 5, 1, 8, 30, 52);
var dateTimeInterval0 = new DatetimeInterval(start0A, end0A);
var start1A = new DateTime(2014, 5, 1, 8, 30, 52);
var end1A = new DateTime(2016, 5, 1, 8, 30, 52);
var dateTimeInterval1 = new DatetimeInterval(start1A, end1A);
var start2A = new DateTime(2016, 5, 1, 8, 30, 52);
var end2A = new DateTime(2020, 5, 1, 8, 30, 52);
var dateTimeInterval2 = new DatetimeInterval(start2A, end2A);
var oldDateTimes = new List<DatetimeInterval>() {dateTimeInterval0, dateTimeInterval1, dateTimeInterval2};
var start0B = new DateTime(2010, 5, 1, 8, 30, 52);
var end0B = new DateTime(2014, 5, 1, 8, 30, 52);
var newDateTimeInterval0 = new DatetimeInterval(start0B, end0B);
var start1B = new DateTime(2015, 5, 1, 8, 30, 52);
var end1B = new DateTime(2018, 5, 1, 8, 30, 52);
var newDateTimeInterval1 = new DatetimeInterval(start1B, end1B);
var newDateTimeChunk0 = new List<DatetimeInterval>() {newDateTimeInterval0, newDateTimeInterval1};
var start2C = new DateTime(2007, 5, 1, 8, 30, 52);
var end2C = new DateTime(2015, 5, 1, 8, 30, 52);
var newDateTimeInterval2 = new DatetimeInterval(start2C, end2C);
var start3D = new DateTime(2012, 5, 1, 8, 30, 52);
var end3D = new DateTime(2013, 5, 1, 8, 30, 52);
var newDateTimeInterval3 = new DatetimeInterval(start3D, end3D);
var newDateTimeChunk1 = new List<DatetimeInterval>() {newDateTimeInterval2, newDateTimeInterval3};
var newDateTimeChunks = new List<List<DatetimeInterval>> () {newDateTimeChunk0, newDateTimeChunk1};
foreach (List<DatetimeInterval> chunkedRegistration in newDateTimeChunks)
IEnumerable<DatetimeInterval> overLappingOldRegistrations = oldDateTimes.Intersect(chunkedRegistration, new OverlapComparer());
Console.WriteLine("new: ");
foreach (DatetimeInterval Registration in chunkedRegistration)
Console.Write("("+Registration.From+","+Registration.To+") ");
Console.WriteLine("Overlapped by:");
foreach (DatetimeInterval Registration in overLappingOldRegistrations)
Console.Write("("+Registration.From+","+Registration.To+") ");