2010-10-12 5 views
2

У меня есть класс со свойством DateTimeOffset:LINQ DateTimeOffset сравнение с сегодня

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

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

IEnumerable<Sample> collection; 

2 вопроса:

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

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

ответ

2
// 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

Спасибо за ответ, но это не сработает, когда d.expires - это DateTimeOffset, как указано в вопросе. – Chris

+0

Хорошо, попробуйте еще раз, я скорректировал запросы для смещения типа. Извините, я пропустил это – danijels

0
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)); 
+0

Спасибо за ответ, но это не работает, когда c.expires является DateTimeOffset, как упоминалось в вопросе – Chris

-1

Это хорошая практика в «кэш» расчетные значения производительности, в противном случае она будет рассчитываться в каждом цикле (как, где делает петлю внутри):

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(); 

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

EDIT: я обновил код, чтобы использовать модель выполнения немедленного запроса, поскольку @danijels предупреждает об отложенном выполнении.

+0

. Я не думаю, что это очень мудро. Поскольку Linq откладывает выполнение, вычисление значений DateTime и передача их в Linq означает, что теоретически, к моменту выполнения выполнения значения могут измениться. Достаточно рассмотреть этот код, работающий за секунды до полуночи, а также некоторую операцию между ними, позволяющую начать новый день, и все не так. Не говоря уже о том, должно ли это быть в скомпилированном запросе linq. – danijels

+0

Это могло бы быть правдой теоретически, но практически отсроченное исполнение могло также закончиться полночь и прикрутить все. Это только хорошая практика, это не правило. – jaraics

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