Overlapping Dates

CSharp · Console

/Program.cs

using System;
using System.Data;
using System.Collections.Generic;

public class Program
{
	public class Dates
	{
		public DateTime ActiveDate;
		public DateTime ExpireDate;
		public string Name;
	}

	public static void Main()
	{
		List<Dates> datesList = new List<Dates>();
		datesList.Add(new Dates{Name = "A", ActiveDate = new DateTime(2017, 8, 20), ExpireDate = new DateTime(2017, 8, 23)}); //Aug 20 - Aug 23
		
		datesList.Add(new Dates{Name = "B", ActiveDate = new DateTime(2017, 8, 20), ExpireDate = new DateTime(2017, 8, 22)}); //Aug 20 - Aug 22
		
		datesList.Add(new Dates{Name = "C", ActiveDate = new DateTime(2017, 8, 22, 23, 0, 0), ExpireDate = new DateTime(2017, 8, 26)}); //Aug 22 11pm - Aug 26

		datesList.Add(new Dates{Name = "D", ActiveDate = new DateTime(2017, 8, 20), ExpireDate = new DateTime(2017, 8, 23)}); //Aug 20 - Aug23
		
		int numOverlapped = 0;
		for (var i = 0; i < datesList.Count; i++)
		{
			var item = datesList[i];
			for (var j = i + 1; j < datesList.Count; j++)
			{
				bool isOverlap = Compare(item, datesList[j]);
				if (isOverlap)
				{
					numOverlapped++;
				}
			}
		}
	}

	private static DateTime? overlapStart
	{
		get;
		set;
	}

	private static DateTime? overlapEnd
	{
		get;
		set;
	}

	private static bool Compare(Dates a, Dates b)
	{
		DateTime? tStartA = a.ActiveDate;
		DateTime? tEndA = a.ExpireDate;
		DateTime? tStartB = b.ActiveDate;
		DateTime? tEndB = b.ExpireDate;
		bool overlap = (tStartA <= tEndB || tEndB == null) && (tStartB <= tEndA || tEndA == null);
		DateTime? overlapStart = null;
		DateTime? overlapEnd = null;
		if (overlap)
		{
			//Find maximum start date. 
			overlapStart = (tStartA >= tStartB) ? tStartA : tStartB;
			//Find Min End date between the two
			overlapEnd = (tEndA <= tEndB) ? tEndA : tEndB;
			if (overlapStart > overlapStart || overlapStart == null)
			{
				overlapStart = overlapStart;
			}

			if (overlapEnd < overlapEnd || overlapEnd == null)
			{
				overlapEnd = overlapEnd;
			}
		}

		string overlapStartShortDateString = overlapStart.ToString();
		string overlapEndShortDateString = overlapEnd.ToString();
		if (overlap)
			Console.WriteLine(a.Name + " and " + b.Name + " Overlap from " + overlapStartShortDateString + " TO:  " + overlapEndShortDateString);
		else
		{
			Console.WriteLine(a.Name + " and " + b.Name + " DO NOT Overlap");
		}

		return overlap;
	}
}
;