我有一个对象列表,每个对象都有 ExpirationDate 属性,类型为 DateTime 。我想检索列表中的最新日期。通过LINQ有一种优雅的方式吗?
类似的东西:
DateTime latestDate = myCollection.Where(r=>r.ExpirationDate.HasValue).MaxDate(r=>r.ExpirationDate.Value);
答案 0 :(得分:22)
DateTime? latestDate = myCollection.Max(r => r.ExpirationDate);
Intellisense应该给你Max()方法。 =)
现在,如果你必须将它分配给DateTime,我会考虑这样做:
DateTime latestDate = myCollection.Where(r => r.ExpirationDate.HasValue)
.Max(r => r.ExpirationDate)
.Value;
这不包括空集合或只有空ExpirationDates的集合的情况。
根据您之前的逻辑,检查
myCollection.Any(r => r.ExpirationDate.HasValue)
在尝试分配值之前,可能是一个好主意。
答案 1 :(得分:7)
你快到了。使用Max:
DateTime? biggest = myCollection.Max(r=>r.ExpirationDate);
如果所有到期日期为空或集合为空,则结果为空,否则为最大日期。
正如您对J. Sheens' answer所评论的那样,您希望将DateTime作为结果,您将需要对任何空集合执行某些操作,或者没有任何具有值的项目,您可以使用
执行此操作DateTime biggest=myCollection.Max(r=>r.ExpirationDate) ?? DateTime.MinValue
这将在前一个示例中为您提供DateTime.MinValue
而不是null(它还优于使用它迭代集合一次的any
子句)。我选择了MinValue
作为例子。你可以使用自己的生日。
使用DateTime?更好,因为它允许你使用null表示意思 - 未定义,因为MinValue
可能是列表中的有效项。
答案 2 :(得分:1)
在分配.ExpriationDate
之前,请确保存在NullReference检查:
DateTime maxDate = myCollection.OrderByDescending(o => o.ExpirationDate).Take(1).FirstOrDefault().ExpirationDate;
的正确理念
DateTime maxDate = objL.Max(o => o.ExpirationDate);
答案 3 :(得分:0)
按日期降序对列表进行排序,然后取第一个(必要时进行投影)。
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
}