c # получает нерабочие дни в месяце на основе смены

#c# #linq #datetime

#c# #linq #дата и время

Вопрос:

У меня есть список дней (рабочих дней) в смене сотрудника, как показано ниже:

 List<int> workingDays = new List<int>();
workingDays.Add(1); // monday
workingDays.Add(2); // tuesday
workingDays.Add(3); // wednesday
workingDays.Add(5); // friday
  

Это рабочие дни для сотрудника.

Теперь мне нужно получить все дни в выбранном месяце, где есть нерабочий день.

Например:

Если в июле 31 день, я должен получить следующий список:

 July 3 // thursday is a non-working day
July 5 // saturday is a non-working day
July 6 // sunday is a nono-working day
July 10 // thursday is a non-working day
  

И так далее…

Есть какие-нибудь подсказки о том, как получить этот список?

Обновить:

Это моя попытка:

 for (int day = 1; day <= DateTime.DaysInMonth(currentDate.Year, currentDate.Month); day  ) {
    DateTime dt = new DateTime(currentDate.Year, currentDate.Month, day);
    var shiftDay = shifts.Where(s => (int) dt.DayOfWeek - 1 == s.Day amp;amp; s.IsActive).First();

    if (shiftDay == null) {

        // this is a non-working day because wasn't found in the shift List

    }
}
  

Ответ №1:

Вам следует использовать DayOfWeek перечисление вместо int, чтобы сделать ваш код более читаемым и менее подверженным ошибкам:

 List<DayOfWeek> workingDays = new List<DayOfWeek>() { 
    DayOfWeek.Monday, DayOfWeek.Tuesday, DayOfWeek.Wednesday, DayOfWeek.Friday
};


var nonWorkingDays = Enumerable.Range(1, 31)
                               .Select(x => new DateTime(2014, 7, x))
                               .Where(d => !workingDays.Contains(d.DayOfWeek))
                               .ToList();
  

Комментарии:

1. Есть ли способ сделать это со значениями Int вместо перечислений DayOfWeek?

2. Вы можете приводить int и DayOfWeek друг к другу. Вы должны быть в состоянии выяснить, как заставить это работать для int s.