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

leo*_*ora 13 c# linq collections

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

就像是:

DateTime latestDate =  myCollection.Where(r=>r.ExpirationDate.HasValue).MaxDate(r=>r.ExpirationDate.Value);
Run Code Online (Sandbox Code Playgroud)

J. *_*een 23

DateTime? latestDate = myCollection.Max(r => r.ExpirationDate);
Run Code Online (Sandbox Code Playgroud)

Intellisense应该给你Max()方法.=)


现在,如果你必须将它分配给DateTime,我会考虑这样做:

DateTime latestDate = myCollection.Where(r => r.ExpirationDate.HasValue)
                                  .Max(r => r.ExpirationDate)
                                  .Value;
Run Code Online (Sandbox Code Playgroud)

这不会涵盖空集合或仅具有空ExpirationDates的集合的情况.


根据您之前的逻辑,检查

myCollection.Any(r => r.ExpirationDate.HasValue)
Run Code Online (Sandbox Code Playgroud)

在尝试分配值之前可能是个好主意.


Bob*_*ale 7

你快到了.使用Max:

DateTime? biggest = myCollection.Max(r=>r.ExpirationDate);
Run Code Online (Sandbox Code Playgroud)

如果所有到期日期为空或集合为空,则结果为空,否则为最大日期.

正如你对J. Sheens的答案所评论的那样,你想要一个DateTime作为结果,你需要对任何空集合做一些事情或者没有任何具有值的项目,你可以用

DateTime biggest=myCollection.Max(r=>r.ExpirationDate) ?? DateTime.MinValue
Run Code Online (Sandbox Code Playgroud)

这将DateTime.MinValue在前一个示例中为您提供而不是null(它还具有使用any它迭代集合一次的子句的优势).我选择MinValue了一个例子.你可以使用自己的生日.

使用DateTime?更好,因为它允许你使用null表示它的意思 - 未定义,因为它MinValue可能是列表中的有效项.