2011-04-10 59 views
49

是否有一個linq lambda搜索方法在搜索列表時返回null,而不是拋出異常?Find()和First()拋出異常,如何返回null?

我目前的解決方案是這樣的:(避免被拋出的異常)

if (list.Exists(x => x.Foo == Foo)) 
{ 
    var listItem = list.Find(x => x.Foo == Foo); 
} 

就覺得這是不對的重複表達。

喜歡的東西...

var listItem = list.Find(x => x.Foo == Foo); 
if (listItem != null) 
{ 
    //Do stuff 
} 

...感覺不如我。還是僅僅是我?

你對這個有更好的方法嗎? (該解決方案不必被返回null,只是一個更好的解決方案是好的)

回答

97
var listItem = list.FirstOrDefault(x => x.Foo == Foo); 
if (listItem != null) 
{ 
    //Do stuff 
} 
29

巴拉的r答案是正確的,我只是想補充一條信息:

注意,如果List<T>包含by-design不能爲空的對象,則FirstOrDefault將返回除null以外的其他內容。編譯器很可能在if語句中給出這個警告/錯誤。在這種情況下,你應該接近您的情況是這樣的:

List<MyObjectThatCannotBeNull> list; 
var listItem = list.FirstOrDefault(x => x.Foo == Foo); 
if (!listItem.Equals(default(MyObjectThatCannotBeNull))) 
{ 
    //Do stuff 
} 
+4

,不要忘記 - 如果你的列表將包含該泛型類型([默認值表]的默認值(http://msdn.microsoft。 com/en-us/library/83fhsxwc.aspx)),您不能使用Find方法判斷值是否存在。在這些情況下,你應該使用FindIndex,Exists或Contains。 – HuBeZa 2011-04-10 17:47:58