Сравнение LINQ DateTimeOffset с сегодняшним днем - PullRequest
2 голосов
/ 13 октября 2010

У меня есть класс со свойством DateTimeOffset:

public class Sample 
{
    public DateTimeOffset expires { get; set; }
}

и, в конечном итоге, их коллекция:

IEnumerable<Sample> collection;

2 вопроса:

  1. Каков наилучший способ создать метод, который возвращает все элементы Sample из коллекции, у которой срок действия больше, чем сейчас и до сих пор существует сегодня (т.е. до полуночи)?

  2. Каков наилучший способ вернуть все образцы предметов из коллекции, срок действия которой истекает в течение следующих 24 часов?

Ответы [ 3 ]

3 голосов
/ 13 октября 2010
// greater than now, still today            
collection.Where(d => d.expires.DateTime > DateTime.Now && d.expires.Date == DateTime.Today);

// expires in the next 24 hours
collection.Where(d => d.expires.DateTime > DateTime.Now && d.expires.DateTime < DateTime.Now.AddHours(24));
0 голосов
/ 13 октября 2010

Хорошей практикой является "кэширование" рассчитанных значений производительности, в противном случае оно будет рассчитываться в каждом цикле (как, например, внутри цикла):

DateTime tomorrow = DateTime.Today.AddDays(1);
DateTime now = DateTime.Now;
DateTime next24hrs = now.AddHours(24);
IEnumerable<Sample> next24HoursSamples = collection.Where(sample=>sample.expires>now && sample.expires<next24hrs).ToList();
IEnumerable<Sample> sameDaySamples = next24HoursSamples.Where(sample=>sample.expires>=now && sample.expires<tomorrow).ToList();

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

РЕДАКТИРОВАТЬ: я обновил код, чтобы использовать модель немедленного выполнения запроса, например @danijelsпредупреждает об отложенном исполнении.

0 голосов
/ 13 октября 2010
var list1 = 
    collection.Where
        (c => c.expires.DateTime > DateTime.Now && 
              c.expires.DateTime < DateTime.Today.AddDays(1));

var list2 = 
    collection.Where
        (c => c.expires.DateTime >= DateTime.Now && 
              c.expires.DateTime <= DateTime.Now.AddHours(24));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...