C# 为什么在LINQ中使用First而不是FirstOrDefault?

C# 为什么在LINQ中使用First而不是FirstOrDefault?,c#,.net,linq,C#,.net,Linq,可能重复: 在LINQ中使用First运算符的意义是什么,而您可以使用FirstOrDefault运算符 var q = results.First(); // Error if empty 与执行null检查相比,显式强制引发异常。这与Int32.Parse与Int32.TryParse的讨论相同。前者在出现故障时抛出异常,后者返回false,程序继续顺利运行…为了直接回答您的特定问题(如果您始终可以使用FirstOrDefault,为什么要使用FirstOrDefault),有些情况下您

可能重复:

在LINQ中使用
First
运算符的意义是什么,而您可以使用
FirstOrDefault
运算符

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

与执行
null
检查相比,显式强制引发异常。

这与
Int32.Parse
Int32.TryParse
的讨论相同。前者在出现故障时抛出异常,后者返回false,程序继续顺利运行…

为了直接回答您的特定问题(如果您始终可以使用
FirstOrDefault
,为什么要使用
FirstOrDefault
),有些情况下您无法使用
FirstOrDefault
,因为它会丢失信息!“默认值”可能是源列表中的有效元素类型。您无法区分枚举中的第一个元素是null/default还是列表中没有元素,除非您使用
first
或首先检查是否有
任何
元素,这需要双重枚举

对于值类型的可枚举项尤其如此,例如
int[]
<代码>默认值(int)为
0
,它很可能也是数组的有效值

通常,这两种方法表示不同的逻辑流<如果没有任何元素是“异常”(一个错误),则将使用code>First,然后希望在应用程序中处理带外。在这个场景中,您“期望”至少有一个元素
FirstOrDefault
在空集上返回null,这意味着您需要对返回的值进行额外处理。这与
int
/
double
/等上的
Parse
vs
TryParse
方法的逻辑类似。事实上,您的问题在某些方面导致了一个更一般的问题,即为什么要使用异常

由于
First
会抛出异常,因此它有助于异常提供的所有代码重用机会。例如,您可以执行以下操作:

try
{
    x = arr1.First();
    y = arr2.First();
    z = arr3.First();
}
catch
{
    throw new ArgumentException();
}

我可以看到一个副本的结束,但是。。。“不具建设性”?:(尽管如此,我认为这个问题可以澄清为什么认为
First
(如果为空则有错误)不如
FirstOrDefault