Единственная сложность состоит в том, чтобы вычислить начальную дату ;давайте используем по модулю арифметики для этого:
public static IEnumerable<DateTime> AllDatesInWeekOfMonth(int year, int month, int week) {
DateTime start = new DateTime(year, month, 1);
start = start
.AddDays((CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek - start.DayOfWeek + 7) % 7)
.AddDays(week * 7 - 7);
for (int i = 0; i < 7; ++i)
if (start.Month == month) {
yield return start;
start = start.AddDays(1);
}
}
Демо:
// Different cultures have different first day of week
// In case of Invariant Culture week starts from Sunday
CultureInfo.CurrentCulture = CultureInfo.InvariantCulture;
string test = string.Join(Environment.NewLine,
AllDatesInWeekOfMonth(2018, 12, 2)
.Select(date => date.ToString("dd MMMM yyyy (dddd)")));
Console.WriteLine(test);
Результат:
09 December 2018 (Sunday) // <- Week starts from Sunday
10 December 2018 (Monday)
11 December 2018 (Tuesday)
12 December 2018 (Wednesday)
13 December 2018 (Thursday)
14 December 2018 (Friday)
15 December 2018 (Saturday)