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

时间:2011-07-21 11:06:57

标签: c# linq collections

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

类似的东西:

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

4 个答案:

答案 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;

Bob Vale had

的正确理念
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
}