2011-04-10 85 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