2011-10-31 3 views
0

私は非常に単純なエンティティのリストを持っています。これは、null可能なDateTimeプロパティを持っています。例: 述語と一致する最初の項目、または一致しない場合は最初の項目を返すにはどうすればよいですか?

私は どちらか日はあなたが言葉に好きな方法で、「最古」、または最も過去に、またはDateTime.Minに最も近いリストに First()項目を返すしたい
class MyEntity 
{ 
    int Id{ get;set; } 
    string Category { get; set; } 
    DateTime? Date{ get; set ; } 
} 

var myentities = new List<MyEntity>(..); 

それ、またはの場合の日付が設定されている場合は、最初の項目を取得します。

これは二つの文で行うことができます。

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

しかし、単一のステートメントでこれを行う方法はありますか?

+1

私はそれをすべてを記述することなく、エンティティのアイデアを与えるためにだけ迅速擬似コード厥NULL可能DateTimeプロパティ – sll

+0

を見つけることができません。 "DateTime?Date"を表示するように編集しました – BlueChippy

+5

myentities.Where(me => me.Date!= null).OrderBy(me => me.Date).FirstOrDefault()?? myentities.First() '単一のステートメントではなく、単一行:D – Stefan

答えて

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

最初のオプションのように... ... OrDefaultの部分! – BlueChippy

+0

最初の答えは私が実際に使用したものなのでティックを与えてください。 – BlueChippy

1

あなたは自分のコレクションを折ることができます。

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

そうでない場合はnull日付の最初のものが返されます、彼らが選択されます日付を持つものがある場合は常に、バックにソートされるヌルされているもの以来。

+0

私は本当にこのソリューションが好きです:) – BlueChippy

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

使用??オペレータあなたのexampelで

var myEntity = myentities.Where(me => me.Date != null).OrderBy(me => me.Date).FirstOrDefault() 
    ?? myentities.First(); 
関連する問題