我有一个非常简单的实体列表,它具有可为空的DateTime属性。 e.g。
class MyEntity
{
int Id{ get;set; }
string Category { get; set; }
DateTime? Date{ get; set ; }
}
var myentities = new List<MyEntity>(..);
我想返回列表中的First()
项,其中 日期是“最旧的”,或者过去最多,或者最接近DateTime.Min,等等如果设置了没有日期,你想用它来表达它,或,然后得到第一个项目。
这可以通过两个陈述来完成:
var myEntity = myentities
.Where(me => me.Date != null)
.OrderBy(me => me.Date)
.FirstOrDefault();
if (myEntity == null)
myEntity = myentities.First();
但是有没有办法在一个声明中做到这一点?
答案 0 :(得分:2)
试试这个
myentities.OrderBy(me=>me.Date.GetValueOrDefault(DateTime.MaxValue)).First();
或者您可以折叠您的收藏
myentities.Aggregate((a, b) => b.Date.HasValue && (!a.Date.HasValue || a.Date.Value > b.Date.Value) ? b : a);
答案 1 :(得分:1)
除了评论中提供的答案外,这应该适用于您的情况。
var myEntity = myentities
.OrderBy(me => me.Date ?? DateTime.MaxValue)
.FirstOrDefault();
由于那些为null的东西总是被排序到后面,如果有那些有日期,那么它们将被选中,否则将返回第一个带有空日期的。
答案 2 :(得分:0)
myentities.Where(d=>d.Date!=null).OrderBy(d=>d.Date).Take(1).Concat(myentities.First()).First()
答案 3 :(得分:0)
使用?操作
var myEntity = myentities.Where(me => me.Date != null).OrderBy(me => me.Date).FirstOrDefault()
?? myentities.First();