using System.Collections.Generic;
public static void Main()
CalculateStartOfWeekDatesTest();
private static List<DateTime> CalculateStartOfWeekDates(List<DateTime> scheduleDates)
if (scheduleDates.Count == 0)
return new List<DateTime>();
var sundays = scheduleDates.Where(date => date.DayOfWeek == DayOfWeek.Sunday);
var firstScheduleDate = scheduleDates.First();
if (firstScheduleDate.DayOfWeek != DayOfWeek.Sunday)
return sundays.Prepend(GetFirstDayOfWeek(firstScheduleDate)).ToList();
public static void CalculateStartOfWeekDatesTest()
var scheduleDates1 = new List<DateTime>
new DateTime(2023, 2, 1),
new DateTime(2023, 2, 2),
new DateTime(2023, 2, 3),
new DateTime(2023, 2, 4),
new DateTime(2023, 2, 5),
new DateTime(2023, 2, 6),
new DateTime(2023, 2, 7),
new DateTime(2023, 2, 8),
new DateTime(2023, 2, 9),
new DateTime(2023, 2, 10),
new DateTime(2023, 2, 11),
new DateTime(2023, 2, 12),
new DateTime(2023, 2, 13),
new DateTime(2023, 2, 14),
new DateTime(2023, 2, 15),
new DateTime(2023, 2, 16),
new DateTime(2023, 2, 17),
new DateTime(2023, 2, 18),
new DateTime(2023, 2, 19),
new DateTime(2023, 2, 20),
new DateTime(2023, 2, 21),
new DateTime(2023, 2, 22),
new DateTime(2023, 2, 23),
new DateTime(2023, 2, 24),
new DateTime(2023, 2, 25),
new DateTime(2023, 2, 26),
new DateTime(2023, 2, 27),
new DateTime(2023, 2, 28),
new DateTime(2023, 3, 1),
new DateTime(2023, 3, 2),
new DateTime(2023, 3, 3),
new DateTime(2023, 3, 4),
new DateTime(2023, 3, 5),
new DateTime(2023, 3, 6),
new DateTime(2023, 3, 7),
new DateTime(2023, 3, 8),
new DateTime(2023, 3, 9),
new DateTime(2023, 3, 10),
new DateTime(2023, 3, 11),
new DateTime(2023, 3, 12),
new DateTime(2023, 3, 13),
new DateTime(2023, 3, 14),
new DateTime(2023, 3, 15),
new DateTime(2023, 3, 16),
new DateTime(2023, 3, 17),
new DateTime(2023, 3, 18),
new DateTime(2023, 3, 19),
new DateTime(2023, 3, 20),
new DateTime(2023, 3, 21),
new DateTime(2023, 3, 22),
new DateTime(2023, 3, 23),
new DateTime(2023, 3, 24),
new DateTime(2023, 3, 25),
new DateTime(2023, 3, 26),
new DateTime(2023, 3, 27),
new DateTime(2023, 3, 28),
new DateTime(2023, 3, 29),
new DateTime(2023, 3, 30),
new DateTime(2023, 3, 31)
var scheduleDates2 = new List<DateTime>
new DateTime(2023, 1, 28),
new DateTime(2023, 1, 29),
new DateTime(2023, 1, 30),
new DateTime(2023, 1, 31),
new DateTime(2023, 2, 1),
new DateTime(2023, 2, 2),
new DateTime(2023, 2, 3),
new DateTime(2023, 2, 4),
new DateTime(2023, 2, 5),
new DateTime(2023, 2, 6),
new DateTime(2023, 2, 7),
new DateTime(2023, 2, 8),
new DateTime(2023, 2, 9),
new DateTime(2023, 2, 10),
new DateTime(2023, 2, 11),
new DateTime(2023, 2, 12),
new DateTime(2023, 2, 13),
new DateTime(2023, 2, 14),
new DateTime(2023, 2, 15),
new DateTime(2023, 2, 16),
new DateTime(2023, 2, 17),
new DateTime(2023, 2, 18),
new DateTime(2023, 2, 19),
new DateTime(2023, 2, 20),
new DateTime(2023, 2, 21),
new DateTime(2023, 2, 22),
new DateTime(2023, 2, 23),
new DateTime(2023, 2, 24),
new DateTime(2023, 2, 25),
new DateTime(2023, 2, 26),
new DateTime(2023, 2, 27),
new DateTime(2023, 2, 28),
new DateTime(2023, 3, 1),
new DateTime(2023, 3, 2),
new DateTime(2023, 3, 3),
new DateTime(2023, 3, 4),
new DateTime(2023, 3, 5),
new DateTime(2023, 3, 6),
new DateTime(2023, 3, 7),
new DateTime(2023, 3, 8),
new DateTime(2023, 3, 9),
new DateTime(2023, 3, 10),
new DateTime(2023, 3, 11),
new DateTime(2023, 3, 12),
new DateTime(2023, 3, 13),
new DateTime(2023, 3, 14),
new DateTime(2023, 3, 15),
new DateTime(2023, 3, 16),
new DateTime(2023, 3, 17),
new DateTime(2023, 3, 18),
new DateTime(2023, 3, 19),
new DateTime(2023, 3, 20),
new DateTime(2023, 3, 21),
new DateTime(2023, 3, 22),
new DateTime(2023, 3, 23),
new DateTime(2023, 3, 24),
new DateTime(2023, 3, 25),
new DateTime(2023, 3, 26),
new DateTime(2023, 3, 27),
new DateTime(2023, 3, 28),
new DateTime(2023, 3, 29),
new DateTime(2023, 3, 30),
new DateTime(2023, 3, 31),
new DateTime(2023, 4, 1),
new DateTime(2023, 4, 2),
var expected1 = new List<DateTime>
new DateTime(2023, 1, 29),
new DateTime(2023, 2, 5),
new DateTime(2023, 2, 12),
new DateTime(2023, 2, 19),
new DateTime(2023, 2, 26),
new DateTime(2023, 3, 5),
new DateTime(2023, 3, 12),
new DateTime(2023, 3, 19),
new DateTime(2023, 3, 26)
var expected2 = new List<DateTime>
new DateTime(2023, 1, 22),
new DateTime(2023, 1, 29),
new DateTime(2023, 2, 5),
new DateTime(2023, 2, 12),
new DateTime(2023, 2, 19),
new DateTime(2023, 2, 26),
new DateTime(2023, 3, 5),
new DateTime(2023, 3, 12),
new DateTime(2023, 3, 19),
new DateTime(2023, 3, 26),
var actual1 = CalculateStartOfWeekDates(scheduleDates1);
var actual2 = CalculateStartOfWeekDates(scheduleDates2);
var success1 = CompareEnumerables(expected1, actual1);
var success2 = CompareEnumerables(expected2, actual2);
Console.WriteLine("EXPECTED 1:" + String.Join(",", expected1));
Console.WriteLine("ACTUAL 1:" + String.Join(",", actual1));
Console.WriteLine("-------------------------------------------");
Console.WriteLine("EXPECTED 2:" + String.Join(",", expected2));
Console.WriteLine("ACTUAL 2:" + String.Join(",", actual2));
Console.WriteLine("===========================================");
Console.WriteLine("TEST 1: " + (success1 ? "SUCCESS" : "*FAILURE*"));
Console.WriteLine("TEST 2: " + (success2 ? "SUCCESS" : "*FAILURE*"));
public static DateTime GetFirstDayOfWeek(DateTime date)
return date.AddDays(Convert.ToDouble(date.DayOfWeek) / -1).Date;
public static bool CompareEnumerables<TSource>(IEnumerable<TSource> A, IEnumerable<TSource> B)
return !A.Except(B).Any() && !B.Except(A).Any() && A.Count() == B.Count() && A.Intersect(B).Count() == B.Count();