如何从使用LINQ的对象集合中获得最新日期?
本文关键字:最新 日期 集合 对象 LINQ | 更新日期: 2023-09-27 18:03:05
我有一个对象列表,每个对象都有一个ExpirationDate属性,其类型为DateTime。我想检索列表中的最新日期。通过LINQ是否有一种优雅的方式来做到这一点?
类似:
DateTime latestDate = myCollection.Where(r=>r.ExpirationDate.HasValue).MaxDate(r=>r.ExpirationDate.Value);
DateTime? latestDate = myCollection.Max(r => r.ExpirationDate);
智能感知应该给你Max()方法。=)
现在,如果您必须将其分配给DateTime,我会考虑这样做:
DateTime latestDate = myCollection.Where(r => r.ExpirationDate.HasValue)
.Max(r => r.ExpirationDate)
.Value;
这将不包括空集合或只有null ExpirationDates的集合的情况。
根据你之前的逻辑,检查
myCollection.Any(r => r.ExpirationDate.HasValue)
在尝试赋值之前,可能是一个好主意
你就快成功了。马克斯:使用
DateTime? biggest = myCollection.Max(r=>r.ExpirationDate);
如果所有的过期日期都为空,或者集合为空,则结果为null,否则为最大日期。
正如您对J. Sheens的回答所评论的那样,您需要一个DateTime作为结果,您将需要对任何空集合或没有带值的项做一些事情,您可以使用
完成此操作DateTime biggest=myCollection.Max(r=>r.ExpirationDate) ?? DateTime.MinValue
这将为您提供DateTime.MinValue
,而不是我前面示例中的null(与使用any
子句相比,它还有一个优点,即它只迭代一次集合)。我以MinValue
为例。你可以用你自己的斋戒日期。
使用DateTime?更好,因为它允许您使用null来表示它的含义-未定义的MinValue
可能是列表中的有效项。
确保在分配.ExpriationDate
之前有一个NullReference检查:
DateTime maxDate = myCollection.OrderByDescending(o => o.ExpirationDate).Take(1).FirstOrDefault().ExpirationDate;
Bob Vale对
的想法是正确的DateTime maxDate = objL.Max(o => o.ExpirationDate);
按日期降序排序,取第一个(必要时投影)。
var latestExpirationDate = myCollection
.Where(item => item.ExpirationDate.HasValue)
.OrderByDescending(item => item.ExpirationDate)
.Select(item => item.ExpirationDate) // DateTime?
.FirstOrDefault();
if (latestExpirationDate != null)
{
// do something with the value stored in latestExpirationDate
}
在我写这篇文章的时候,我的印象是Max()
方法只操作数字类型(即int、short、decimal等)。它似乎也适用于DateTime
对象。所以这也可以工作:
var expiredItems = myCollection
.Where(item => item.ExpirationDate.HasValue);
if (expiredItems.Any())
{
var latestExpirationDate = expiredItems.Max(item => item.ExpirationDate.Value);
// do something with latestExpirationDate
}