如果没有匹配,如何返回与谓词匹配的第一个项目或简单的第一个项目?

时间:2011-10-31 11:07:21

标签: c# linq datetime nullable

我有一个非常简单的实体列表,它具有可为空的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();

但是有没有办法在一个声明中做到这一点?

4 个答案:

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