如何从使用LINQ的对象集合中获得最新日期?

本文关键字:最新 日期 集合 对象 LINQ | 更新日期: 2023-09-27 18:03:05

我有一个对象列表,每个对象都有一个ExpirationDate属性,其类型为DateTime。我想检索列表中的最新日期。通过LINQ是否有一种优雅的方式来做到这一点?

类似:

DateTime latestDate =  myCollection.Where(r=>r.ExpirationDate.HasValue).MaxDate(r=>r.ExpirationDate.Value);

如何从使用LINQ的对象集合中获得最新日期?

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
}