using System.Collections.Generic;
public static void Main()
DateTime d1 = new DateTime(2019, 11, 21, 0, 0, 0);
DateTime d2 = new DateTime(2020, 11, 21, 0, 0, 0);
DateTime d3 = new DateTime(2021, 11, 21, 0, 0, 0);
var firstRange = NumberOfLeapYears(d1, d2);
var secondRange = NumberOfLeapYears(d2, d3);
Console.WriteLine($"Expected 1: Actual: {firstRange.Count}, First Range should have 1 leap year");
Console.WriteLine($"Expected 1: Actual: {secondRange.Count}, Second Range should have 1 leap year");
var firstRangeRefactor = NumberOfLeapYearsRefactor(d1, d2);
var secondRangeRefactor = NumberOfLeapYearsRefactor(d2, d3);
Console.WriteLine($"Expected 1: Actual: {firstRangeRefactor.Count}, First Range Refactor should have 1 leap year");
Console.WriteLine($"Expected 1: Actual: {secondRangeRefactor.Count}, Second Range Refactor should have 1 leap year");
var d4 = new DateTime(2020, 12, 21, 0, 0, 0);
var sameYearOriginal = NumberOfLeapYears(d1, d2);
var sameYearRefactor = NumberOfLeapYearsRefactor(d2, d3);
Console.WriteLine($"Expected 1: Actual: {sameYearOriginal.Count}, Same Year Range (Original Imp) should have 1 leap year");
Console.WriteLine($"Expected 1: Actual: {sameYearRefactor.Count}, Same Year Range (Refactor Imp) should have 1 leap year");
public static List<int> NumberOfLeapYears(DateTime effectiveDate, DateTime expirationDate)
List<int> numberOfLeapYears = new List<int>();
for (var dt = effectiveDate.Year; dt <= expirationDate.Year; dt++)
if (DateTime.IsLeapYear(dt))
DateTime LeapMonth = new DateTime(dt, 2, 29, 0, 0, 0);
if (LeapMonth > effectiveDate && LeapMonth <= expirationDate)
numberOfLeapYears.Add(dt);
return numberOfLeapYears;
public static List<int> NumberOfLeapYearsRefactor(DateTime effectiveDate, DateTime expirationDate)
List<int> numberOfLeapYears = new List<int>();
for (var dt = effectiveDate.Year; dt <= expirationDate.Year; dt++)
if (DateTime.IsLeapYear(dt))
numberOfLeapYears.Add(dt);
return numberOfLeapYears;