Find() 和 First() 抛出异常,如何改为返回 null?

Posted

技术标签:

【中文标题】Find() 和 First() 抛出异常,如何改为返回 null?【英文标题】:Find() and First() throws exceptions, how to return null instead? 【发布时间】:2011-08-02 13:49:27 【问题描述】:

在搜索列表时,是否有返回 null 而不是抛出异常的 linq lambda 搜索方法?

我目前的解决方案是这样的:(避免抛出异常)

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,更好的解决方案就好)

【问题讨论】:

List.Find 的行为有变化吗? .Net 的当前版本允许第二个示例。如果没有找到匹配的元素,List.Find 是否会引入旧版本的 .Net Framework? 【参考方案1】:
var listItem = list.FirstOrDefault(x => x.Foo == Foo);
if (listItem != null)

    //Do stuff

【讨论】:

【参考方案2】:

巴拉R的回答是对的,我只是想补充一点:

请注意,如果List<T> 包含设计上不能为空的对象,则FirstOrDefault 将返回null 以外的其他内容。编译器可能会在 if 语句中给出警告/错误。在这种情况下,您应该像这样处理您的情况:

List<MyObjectThatCannotBeNull> list;
var listItem = list.FirstOrDefault(x => x.Foo == Foo);
if (!listItem.Equals(default(MyObjectThatCannotBeNull)))

    //Do stuff

【讨论】:

不要忘记 - 如果您的列表将包含该泛型类型的默认值 (Default Values Table),您无法使用 Find 方法判断该值是否存在。在这些情况下,您应该使用FindIndexExistsContains【参考方案3】:

你可以使用“is”运算符:)

  List<T> list;
  if (list.Find(x => x.Foo == Foo) is T yourObject)
  
     //do stuff with yourObject.
  

【讨论】:

以上是关于Find() 和 First() 抛出异常,如何改为返回 null?的主要内容,如果未能解决你的问题,请参考以下文章

java显示抛出系统异常

Laravel框架——增删改查

实体框架在使用 Find 方法时抛出异常

抛出异常改404

即使元素存在,Selenium find_element 也会抛出异常

QueueUserAPC - 抛出异常崩溃,可能的 mingw 错误