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

本文关键字:第一个 项目 返回 何返回 或者 如果没有 谓词 | 更新日期: 2023-09-27 18:12:46

我有一个非常简单的实体列表,它有一个可空的DateTime属性。例如

class MyEntity 
{
    int Id{ get;set; }
    string Category { get; set; }
    DateTime? Date{ get; set ; }
}
var myentities = new List<MyEntity>(..);

我想返回列表中的First()项,其中日期是"最古老的",或过去最多,或最接近DateTime。无论你想用什么方式来表达,如果没有日期,则取第一项。

这可以用两个语句来完成:

var myEntity = myentities
    .Where(me => me.Date != null)
    .OrderBy(me => me.Date)
    .FirstOrDefault();
if (myEntity == null)
  myEntity = myentities.First();

但是有没有办法在一个单独的语句中做到这一点呢?

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

试试这个

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);

除了评论中提供的答案之外,这应该适用于您的情况。

var myEntity = myentities
   .OrderBy(me => me.Date ?? DateTime.MaxValue)
   .FirstOrDefault();

由于那些为空的将总是排序到后面,如果有日期,那么它们将被选择,否则第一个具有空日期的将被返回。

myentities.Where(d=>d.Date!=null).OrderBy(d=>d.Date).Take(1).Concat(myentities.First()).First()

use ??操作符

var myEntity = myentities.Where(me => me.Date != null).OrderBy(me => me.Date).FirstOrDefault()
   ?? myentities.First();