Если вам не нужно рассматривать праздники, я бы посоветовал вам сделать что-то вроде этого:
public static DateTime AddWorkingDays(DateTime specificDate,
int workingDaysToAdd)
{
int completeWeeks = workingDaysToAdd / 5;
DateTime date = specificDate.AddDays(completeWeeks * 7);
workingDaysToAdd = workingDaysToAdd % 5;
for (int i = 0; i < workingDaysToAdd; i++)
{
date = date.AddDays(1);
while (!IsWeekDay(date))
{
date = date.AddDays(1);
}
}
return date;
}
private static bool IsWeekDay(DateTime date)
{
DayOfWeek day = date.DayOfWeek;
return day != DayOfWeek.Saturday && day != DayOfWeek.Sunday;
}
Это неэффективно, но легко понять. Для эффективной версии вы должны добавить количество полных недель для добавления, как и прежде, но затем иметь сопоставление с любым «текущим днем недели» и «оставшимися рабочими днями» для добавления к « фактическому *» 1005 * дней, чтобы добавить ". Тогда вы можете просто определить общее количество дней, которое нужно добавить, и сделать это за один вызов.
РЕДАКТИРОВАТЬ: С точки зрения уровня неэффективности ... это действительно не очень плохо. Он будет выполнять только ручные проверки «это выходные» в течение 4 дней, что не так уж плохо. В частности, несмотря на заявления Игора (действующие на момент публикации), он намного быстрее, чем его подход, несмотря на некорректные тесты;)
Обратите внимание, что он может еще не обрабатывать отрицательные входные данные - я не проверял.
Одна из причин использования подхода, который я использую, заключается в том, что он не полагается ни на меня, ни на читателя кода, знающих, каковы значения в перечислении DayOfWeek
. Мне все равно, будь то 0-6, 1-7, понедельник-воскресенье, суббота-пятница ... или даже если есть совершенно странные значения. Я сравниваю только на равенство, что делает код более «очевидно правильным».