Вопрос о комбинации Linq, Lambda и Nullable DateTime - PullRequest
0 голосов
/ 16 апреля 2011

У меня есть расписание класса:

public class Schedule
{

 .....

 public DateTime? StartDate{get;set;}
 public DateTime? EndDate{get;set;}

 ....

}

Я хотел бы получить список запущенных объектов Schedule из списка IEnumerable оптимальным образом, используя linq или lambda .


ПРИМЕЧАНИЕ: Пустое значение даты здесь означает бесконечность. Однако неопределенный период расписания (пустые даты начала и окончания) означает, что расписание не запущено.

Ответы [ 3 ]

0 голосов
/ 16 апреля 2011
var started =
    from s in schedules
    let startDate = s.StartDate ?? DateTime.MaxValue
    let endDate = s.EndDate ?? DateTime.MinValue
    where startDate <= DateTime.Now
    && endDate > DateTime.Now
    select s;
0 голосов
/ 16 апреля 2011
schedules.Where(s => s.StartDate < DateTime.Now
                     || (s.StartDate == null && s.EndDate != null));

Предполагается, что вам действительно нужно то, что вы сказали - все запущенные расписания, включая те, которые уже закончились.

Кроме того, вы можете изменить способ представления неопределенного периода графика, возможно, добавив для этого bool. Если null означает бесконечность, это всегда должно означать бесконечность.

0 голосов
/ 16 апреля 2011
bool IsStarted(Schedule schedule) {
   // Assuming that ended schedules should be excluded
   return schedule.StartDate != null && schedule.StartDate > DateTime.Now
       && (schedule.EndDate==null || schedule.EndDate < Datetime.Now);
}

items.Where(IsStarted);

Если возможно, было бы не самой плохой идеей сделать IsStarted свойством вашего класса Schedule. В этом случае вам придется использовать:

items.Where(i => i.IsStarted);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...