2016-01-19 4 views
0

У меня есть следующий кодIEnumerable За исключением не работает

/// <summary> 
///  Calculates the date with a number of working days offset from today by 
///  calculating a set of dates that exclude weekends and holidays, then 
///  skipping forward the required number of days. 
/// </summary> 
public static DateTime AddWorkingDays(int workingDays, DateTime startDate) 
{ 
    var workDaysQuery = from n in Enumerable.Range(0, (workingDays + 14) * 2) 
         let date = startDate.AddDays(n) 
         where (date.DayOfWeek != DayOfWeek.Sunday) && (date.DayOfWeek != DayOfWeek.Saturday) 
         select date; 
    var publicHolidays = GetPublicHolidays(); 

    var daysWorking = workDaysQuery.Except(publicHolidays).ToArray(); // why does this still include the publicHolidays ? 

    return daysWorking.Skip(workingDays).First(); 
} 

Однако исключение не удаляют государственные праздники.

Временная составляющая государственных праздников равна нулю.

+0

Попробуйте заменить 'select date'' на 'select date.Date;' и замените 'publicHolidays' на' publicHolidays.Select (x => x.Date) '(это необходимо, если значения' publicHolidays' содержат время) –

+5

Мое предположение: компонент времени 'startDate' не равен нулю. Измените его на 'let date = startDate.Date.AddDays (n)' –

ответ

3

Попробуйте это:

public static DateTime AddWorkingDays(int workingDays, DateTime startDate) 
{ 
    var workDaysQuery = from n in Enumerable.Range(0, (workingDays + 14) * 2) 
         let date = startDate.AddDays(n) 
         where (date.DayOfWeek != DayOfWeek.Sunday) 
         && (date.DayOfWeek != DayOfWeek.Saturday) 
         select date.Date; //Remove the time component 

    //The following change is not needed if you know for sure that 
    //values returned by GetPublicHolidays() will not include a time component 
    var publicHolidays = GetPublicHolidays().Select(x => x.Date); 

    var daysWorking = workDaysQuery.Except(publicHolidays).ToArray(); 

    return daysWorking.Skip(workingDays).First(); 
} 

В принципе, если два DateTime значения имеют ту же дату (год, месяц и день), но другой компонент времени, то система будет рассматривать их как не равны.

Что делает код выше, так это то, что он использует свойство Date, чтобы получить только компонент даты (без времени). Таким образом, проверки соответствия (сделанные по умолчанию Except) будут правильными.

+0

ah workDaysQuery имеет даты с 12:00, а publicHoilidays - с 12:00. –

Смежные вопросы