如何返回与谓词匹配的第一个项目,或者如果没有匹配,则返回第一个项目
本文关键字:第一个 项目 返回 何返回 或者 如果没有 谓词 | 更新日期: 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();