为啥在 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
【问题讨论】:
我可以看到一个副本的结束,但是......“没有建设性”? :( 虽然,我认为这个问题可以澄清 whyFirst
(带有 Error-if-empty)被认为不如 FirstOrDefault
理想。
【参考方案1】:
要直接回答您的具体问题(为什么要使用First
,如果您总是可以使用FirstOrDefault
),有些情况下您不能使用FirstOrDefault
,因为它会丢失信息! “默认值”可能是源列表中的有效元素类型。您无法区分枚举中的第一个元素为空/默认与列表中没有元素,除非您使用 First
或首先检查是否有 Any
元素,这需要双枚举。
对于值类型的枚举尤其如此,例如int[]
。 default(int)
是 0
,这也很可能是数组的有效值。
一般来说,这两种方法代表不同的逻辑流程。如果没有任何元素是“异常”(错误),则将使用First
,然后要在您的应用程序中处理带外。在这种情况下,您“期望”至少有一个元素。 FirstOrDefault
在空集上返回 null,这意味着您需要对返回的值进行额外的处理。这与int
/double
/etc 上的Parse
与TryParse
方法的逻辑相似。事实上,您的问题在某些方面会引出一个更普遍的问题,即为什么要使用异常。
由于First
会引发异常,因此它适用于异常提供的所有代码重用机会。例如,您可以这样做:
try
x = arr1.First();
y = arr2.First();
z = arr3.First();
catch
throw new ArgumentException();
【讨论】:
【参考方案2】:显式强制引发异常而不是执行null
检查。
【讨论】:
【参考方案3】:这与Int32.Parse
与Int32.TryParse
的讨论相同。前者失败则抛出异常,后者返回false,程序顺利继续……
【讨论】:
以上是关于为啥在 LINQ 中使用 First 而不是 FirstOrDefault? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
为啥 XNode 在 System.XML.Linq 命名空间而不是 System.XML?
LINQ 查询到 LINQ 方法;为啥我需要 CBool?
为啥 Code First 的 Add-migration 命令包含所有数据库,而不是我对实体所做的特定更改?
为啥在sql sever中使用first和last函数查询,提示‘first’'last' 不是可以识别的 内置函数名称。