可能重复:
When to use .First and when to use .FirstOrDefault with LINQ?
当您可以使用First
运算符时,在LINQ中使用FirstOrDefault
运算符有什么意义?
var q = results.First(); // Error if empty
答案 0 :(得分:17)
要直接回复您的具体问题(如果您始终可以使用First
,请使用FirstOrDefault
),有些情况下您无法使用FirstOrDefault
,因为它会丢失信息! “默认值”可能是源列表中的有效元素类型。您无法区分枚举中的第一个元素是null / default与列表中没有元素,除非您使用First
或首先检查是否有Any
个元素,这需要double -enumeration。
对于值类型的枚举尤其如此,例如int[]
。 default(int)
为0
,也很可能是数组的有效值。
通常,这两种方法代表不同的逻辑流程。如果没有任何元素是“例外”(错误),则会使用First
,然后它会在您的应用程序中处理带外情况。在这种情况下,您“期望”至少拥有一个元素。 FirstOrDefault
在空集上返回null,这意味着您需要使用返回的值执行其他处理。这与Parse
/ TryParse
/等上的int
vs double
方法类似。事实上,你的问题在某些方面导致了一个更普遍的问题,即为什么要使用例外。
由于First
抛出异常,因此它适用于异常提供的所有代码重用机会。例如,你可以这样做:
try
{
x = arr1.First();
y = arr2.First();
z = arr3.First();
}
catch
{
throw new ArgumentException();
}
答案 1 :(得分:8)
明确强制引发异常而不是执行null
检查。
答案 2 :(得分:2)
与Int32.Parse
与Int32.TryParse
的讨论相同。如果失败,前者抛出异常,后者返回false并且程序继续顺利...