2013-04-26 2 views
2

У меня есть список расписаний, которые начинаются и заканчиваются в разные дни. Когда я ищу все расписания за неделю, я хочу перечислить все периоды времени, которые находятся в пределах диапазона этой недели, даже те, которые могут начинаться или заканчиваться на улице, но имеют один или несколько дней в течение недели, см. Пример изображения:Оптимизация расписания

enter image description here

чтобы разобраться в этом я сделал следующий код:

var weekStart = DateTime.Now().Date; 
var weekEnd = weekStart.AddDays(6); 

var thisWeek = schedules.Where(x => 
     (x.ScheduleStartDate >= weekStart && x.ScheduleStartDate <= weekEnd && x.ScheduleEndDate <= weekEnd && x.ScheduleEndDate >= weekStart) || 
     (x.ScheduleStartDate <= weekStart && x.ScheduleEndDate <= weekEnd && x.ScheduleEndDate >= weekStart) || 
     (x.ScheduleStartDate >= weekStart && x.ScheduleStartDate <= weekEnd && x.ScheduleEndDate >= weekEnd) || 
     (x.ScheduleStartDate <= weekStart && x.ScheduleEndDate >= weekEnd) 
    ); 

Этот код так что мой вопрос теперь работает нормально, если есть способ, чтобы оптимизировать его или просто сделать код выглядеть лучше?

+0

Это плохое название. Пожалуйста, прочитайте http://meta.stackexchange.com/questions/10647/how-do-i-write-a-good-title –

+2

Если это работает, тогда ваш вопрос может быть лучше размещен по адресу: http: //codereview.stackexchange .com /. Код выглядит хорошо для меня, вы использовали лямбда-выражения, поэтому код более читабельен, думаю, это все, что вы можете сделать. – jAC

+0

Вы можете использовать Betweens, чтобы сократить ваш запрос. См. Http://stackoverflow.com/a/13470099/2231703 – HikeMike

ответ

-1

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

0
var thisWeek = schedules.Where(x => 
     (x.ScheduleStartDate >= weekStart && x.ScheduleStartDate <= weekEnd && x.ScheduleEndDate <= weekEnd && x.ScheduleEndDate >= weekStart) || 
     (x.ScheduleStartDate <= weekStart && x.ScheduleEndDate <= weekEnd && x.ScheduleEndDate >= weekStart) || 
     (x.ScheduleStartDate >= weekStart && x.ScheduleStartDate <= weekEnd && x.ScheduleEndDate >= weekEnd) || 
     (x.ScheduleStartDate <= weekStart && x.ScheduleEndDate >= weekEnd) 
    ); 

, если дата начала меньше, чем в выходные дни и больше, что потом неделю начать конец не имеет значения , например ваше назначение начинается или заканчивается в течение недели.
Это то же самое на дату окончания

var thisWeek = schedules.Where(x => 
     (x.ScheduleStartDate >= weekStart && x.ScheduleStartDate <= weekEnd) || 
     (x.ScheduleEndDate <= weekEnd && x.ScheduleEndDate >= weekStart) 
    ); 

В предположении, что дата окончания начальной даты и недели начинается до того, как заканчивается теперь вы можете уменьшить это еще

var thisWeek = schedules.Where(x => 
     (x.ScheduleStartDate <= weekEnd && x.ScheduleEndDate >= weekStart) 
    ); 

Это теперь говорится, что назначение начинается до окончания недели и заканчивается после начала недели.

Так как вы хотите, как минимум один день перекрытия

var thisWeek = schedules.Where(x => 
     x.ScheduleStartDate <= weekEnd.AddDays(-1) && x.ScheduleEndDate >= weekStart.AddDays(1) 
    ); 
Смежные вопросы