Как вернуть первый элемент, который соответствует предикату, или просто первый элемент, если ни один не соответствует? - PullRequest
0 голосов
/ 31 октября 2011

У меня есть список очень простой сущности, которая имеет свойство DateTime, допускающее значение NULL. например,

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 ]

2 голосов
/ 31 октября 2011

Попробуйте это

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 голос
/ 31 октября 2011

В дополнение к ответу, представленному в комментариях, это должно работать в вашем случае.

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

Так как те, которые являются нулевыми, всегда будут сортироваться на заднюю часть, если есть те с датами, то онибудет выбран в противном случае будет возвращен первый с нулевой датой.

0 голосов
/ 31 октября 2011

использовать ?? оператор

var myEntity = myentities.Where(me => me.Date != null).OrderBy(me => me.Date).FirstOrDefault()
   ?? myentities.First();
0 голосов
/ 31 октября 2011
myentities.Where(d=>d.Date!=null).OrderBy(d=>d.Date).Take(1).Concat(myentities.First()).First()
...