2011-10-31 77 views
0

我有一個非常簡單的實體,它具有可爲空的DateTime屬性的列表。 例如如何返回與謂詞相匹配的第一個項目,或者如果沒有匹配項目,則返回第一個項目?

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

但是,有沒有辦法在一個單獨的語句來做到這一點?

+1

在你exampel我無法找到可爲空的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

像第一個選項...沒有意識到你可以指定的值...或默認部分! – BlueChippy

+0

由於第一個答案就是我實際使用的那個滴答。 – BlueChippy

1

除了在評論中給出了答案,這應該在你的情況下工作。

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

因爲那些空將永遠被分揀到後面,如果有使用日期的人那麼他們將被選擇,否則第一個用空日期將被退回。

+0

我真的很喜歡這個解決方案,謝謝:) – BlueChippy

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

用途??運營商

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