2014-04-15 93 views
0

假設我有對象模型的列表看起來像這樣:LINQ從列表中獲取可空日期時間的最大

public class MyModel 
{ 
    public Nullable<DateTime> SomeUserTime { get; set; } 
} 

var List<MyModel> TheList = some list from somewhere 

我想在列表中的最新SomeUserTime,知道可能是列表不包含任何值,在這種情況下,輸出應該爲空。這是我有:

DateTime? LatestTime = (from x in TheList select x.SomeUserTime).Max(); 

這編譯好,但示例數據沒有任何空值。如果列表中沒有任何元素有時間,這也可以工作(即返回null)嗎?

謝謝。

+3

你爲什麼不試試它? –

+0

@DanielBrückner:「樣本數據沒有任何空值」,所以我沒有創建新的樣本數據,而只是問了一個問題。 – frenchie

+0

你確定你沒有得到關於隱式轉換'System.DateTime?'到'System.DateTime'的編譯錯誤嗎? –

回答

4

是的,它會忽略null的值,並給你最大的DateTime?

List<DateTime?> list = new List<DateTime?>(); 
list.Add(new DateTime?()); 
list.Add(new DateTime(2014,04,15)); 
DateTime? max = list.Max(); 

,你會回來:

max = {15/04/2014 12:00:00 AM} 

您還可以過濾掉null值,然後獲得最大的,如:

DateTime LatestTime = (from x in TheList 
         where x.SomeUserTime != null) //or x.SomeUserTime.HasValue 
         select x.SomeUserTime.Value).Max(); 

以上行將如果列表拋出一個異常是空的。您將獲得:

Sequence contains no elements 

你能解決這個問題,如:

DateTime? LatestTime = (from x in TheList 
         select x.SomeUserTime).Max(); 

如果列表爲空,那麼這會給你null,或者如果列表中包含的任何DateTime返回值,你最大的日期。只需確認您並非試圖將結果存儲在DateTime中,請使用Nullable<DateTime>DateTime?並且不要訪問Value屬性Nullable<T>項。

+0

如果列表只有空值,該怎麼辦?將最大值爲null? – frenchie

+1

不錯....... –

+0

@frenchie,在這種情況下,你將不得不使用'DateTime? LatestTime = TheList.Select(r => r.SomeUserTime).Max();'然後它將是空的。 – Habib

1

我認爲最保險的辦法將是這樣的

TheList.Select(model=>model.SomeUserTime).OrderByDescending().FirstOrdefault() 

這將返回一個空的,如果你的列表是空的

+0

如果列表爲空,那麼Nullable類型的'Max'將返回'null'。 – Habib

2

這也應該工作。不需要分類

TheList.Select(x=>x.SomeUserTime??DateTime.MinValue).Max()) 
相關問題