#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.