using System;
using System.Linq;
using System.Collections.Generic;
public class Test
{
class LockedDate
{
public bool IsYearly;
public DateTime Date;
}
static List<DateTime> GetDateRange(List<LockedDate> source, DateTime start, DateTime end)
{
if (start > end)
throw new ArgumentException("Start must be before end");
var ts = end - start;
var dates = Enumerable.Range(0, ts.Days)
.Select(i => start.AddDays(i))
.Where(d => source.Any(ld => ld.Date == d
|| (ld.IsYearly && ld.Date.Month == d.Month && ld.Date.Day == d.Day)));
return dates.ToList();
}
public static void Main()
{
DateTime start = new DateTime(2013, 01, 22);
DateTime end = new DateTime(2015, 02, 23);
var lockDates = new List<LockedDate> {
new LockedDate { Date = new DateTime(2013, 12, 25), IsYearly = true } ,
new LockedDate { Date = new DateTime(2011, 12, 02), IsYearly = false } ,
new LockedDate { Date = new DateTime(2013, 03, 25), IsYearly = false }
};
var range = GetDateRange(lockDates, start, end);
foreach(DateTime dt in range)
Console.WriteLine(dt.ToString("dddd, MMMM dd, yyyy"));
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uTGlucTsKdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CgpwdWJsaWMgY2xhc3MgVGVzdAp7CiAgICBjbGFzcyBMb2NrZWREYXRlCiAgICB7CiAgICAgICAgcHVibGljIGJvb2wgSXNZZWFybHk7CiAgICAgICAgcHVibGljIERhdGVUaW1lIERhdGU7CiAgICB9CgogICAgc3RhdGljIExpc3Q8RGF0ZVRpbWU+IEdldERhdGVSYW5nZShMaXN0PExvY2tlZERhdGU+IHNvdXJjZSwgRGF0ZVRpbWUgc3RhcnQsIERhdGVUaW1lIGVuZCkKICAgIHsKICAgICAgICBpZiAoc3RhcnQgPiBlbmQpCiAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiU3RhcnQgbXVzdCBiZSBiZWZvcmUgZW5kIik7CgogICAgICAgIHZhciB0cyA9IGVuZCAtIHN0YXJ0OwogICAgICAgIHZhciBkYXRlcyA9IEVudW1lcmFibGUuUmFuZ2UoMCwgdHMuRGF5cykKICAgICAgICAgICAgLlNlbGVjdChpID0+IHN0YXJ0LkFkZERheXMoaSkpCiAgICAgICAgICAgIC5XaGVyZShkID0+IHNvdXJjZS5BbnkobGQgPT4gbGQuRGF0ZSA9PSBkCiAgICAgICAgICAgICAgICB8fCAobGQuSXNZZWFybHkgJiYgbGQuRGF0ZS5Nb250aCA9PSBkLk1vbnRoICYmIGxkLkRhdGUuRGF5ID09IGQuRGF5KSkpOwogICAgICAgIHJldHVybiBkYXRlcy5Ub0xpc3QoKTsKICAgIH0KICAgICAgICAKCXB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKCkKCXsKCQkgICAgRGF0ZVRpbWUgc3RhcnQgPSBuZXcgRGF0ZVRpbWUoMjAxMywgMDEsIDIyKTsKICAgICAgICAgICAgRGF0ZVRpbWUgZW5kID0gbmV3IERhdGVUaW1lKDIwMTUsIDAyLCAyMyk7CiAgICAgICAgICAgIHZhciBsb2NrRGF0ZXMgPSBuZXcgTGlzdDxMb2NrZWREYXRlPiB7IAogICAgICAgICAgICAgICAgbmV3IExvY2tlZERhdGUgeyBEYXRlID0gbmV3IERhdGVUaW1lKDIwMTMsIDEyLCAyNSksIElzWWVhcmx5ID0gdHJ1ZSB9ICwKICAgICAgICAgICAgICAgIG5ldyBMb2NrZWREYXRlIHsgRGF0ZSA9IG5ldyBEYXRlVGltZSgyMDExLCAxMiwgMDIpLCBJc1llYXJseSA9IGZhbHNlIH0gLAogICAgICAgICAgICAgICAgbmV3IExvY2tlZERhdGUgeyBEYXRlID0gbmV3IERhdGVUaW1lKDIwMTMsIDAzLCAyNSksIElzWWVhcmx5ID0gZmFsc2UgfSAKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIHJhbmdlID0gR2V0RGF0ZVJhbmdlKGxvY2tEYXRlcywgc3RhcnQsIGVuZCk7CiAgICAgICAgICAgIGZvcmVhY2goRGF0ZVRpbWUgZHQgaW4gcmFuZ2UpCiAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGR0LlRvU3RyaW5nKCJkZGRkLCBNTU1NIGRkLCB5eXl5IikpOwoJfQp9