为啥在 LINQ 中使用 First 而不是 FirstOrDefault? [复制]

Posted

技术标签:

【中文标题】为啥在 LINQ 中使用 First 而不是 FirstOrDefault? [复制]【英文标题】:Why use First instead of FirstOrDefault in LINQ? [duplicate]为什么在 LINQ 中使用 First 而不是 FirstOrDefault? [复制] 【发布时间】:2011-12-03 21:20:54 【问题描述】:

可能重复:When to use .First and when to use .FirstOrDefault with LINQ?

在 LINQ 中使用 First 运算符有什么意义,而您可以改用 FirstOrDefault 运算符?

var q = results.First(); // Error if empty

【问题讨论】:

我可以看到一个副本的结束,但是......“没有建设性”? :( 虽然,我认为这个问题可以澄清 why First(带有 Error-if-empty)被认为不如 FirstOrDefault 理想。 【参考方案1】:

要直接回答您的具体问题(为什么要使用First,如果您总是可以使用FirstOrDefault),有些情况下您不能使用FirstOrDefault,因为它会丢失信息! “默认值”可能是源列表中的有效元素类型。您无法区分枚举中的第一个元素为空/默认与列表中没有元素,除非您使用 First 或首先检查是否有 Any 元素,这需要双枚举。

对于值类型的枚举尤其如此,例如int[]default(int)0,这也很可能是数组的有效值。

一般来说,这两种方法代表不同的逻辑流程。如果没有任何元素是“异常”(错误),则将使用First,然后要在您的应用程序中处理带外。在这种情况下,您“期望”至少有一个元素。 FirstOrDefault 在空集上返回 null,这意味着您需要对返回的值进行额外的处理。这与int/double/etc 上的ParseTryParse 方法的逻辑相似。事实上,您的问题在某些方面会引出一个更普遍的问题,即为什么要使用异常。

由于First 会引发异常,因此它适用于异常提供的所有代码重用机会。例如,您可以这样做:

try

    x = arr1.First();
    y = arr2.First();
    z = arr3.First();

catch

    throw new ArgumentException();

【讨论】:

【参考方案2】:

显式强制引发异常而不是执行null 检查。

【讨论】:

【参考方案3】:

这与Int32.ParseInt32.TryParse 的讨论相同。前者失败则抛出异常,后者返回false,程序顺利继续……

【讨论】:

以上是关于为啥在 LINQ 中使用 First 而不是 FirstOrDefault? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 XNode 在 System.XML.Linq 命名空间而不是 System.XML?

为啥在 Swift 中使用“let”而不是 var?

LINQ 查询到 LINQ 方法;为啥我需要 CBool​​?

为啥 Code First 的 Add-migration 命令包含所有数据库,而不是我对实体所做的特定更改?

为啥我得到零而不是1?

为啥在sql sever中使用first和last函数查询,提示‘first’'last' 不是可以识别的 内置函数名称。