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
vsTryParse
方法的逻辑类似。事实上,您的问题在某些方面导致了一个更一般的问题,即为什么要使用异常
由于First
会抛出异常,因此它有助于异常提供的所有代码重用机会。例如,您可以执行以下操作:
try
{
x = arr1.First();
y = arr2.First();
z = arr3.First();
}
catch
{
throw new ArgumentException();
}
我可以看到一个副本的结束,但是。。。“不具建设性”?:(尽管如此,我认为这个问题可以澄清为什么认为
First
(如果为空则有错误)不如FirstOrDefault
。