关于c#:为什么在LINQ中使用First而不是FirstOrDefault?

Why use First instead of FirstOrDefault in LINQ?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
When to use .First and when to use .FirstOrDefault with LINQ?

在LINQ中使用First操作符有什么意义,而您可以使用FirstOrDefault操作符?

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


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

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

通常,这两种方法代表不同的逻辑流。如果没有任何元素是"异常的"(一个错误),那么将使用First,它随后希望在应用程序中处理带外的问题。在这个场景中,您"期望"至少有一个元素。FirstOrDefault返回空集合的空值,这意味着您需要对返回的值进行额外的处理。这与ParseTryParse方法在intdouble等方面的逻辑相似。实际上,您的问题在某些方面导致了更普遍的问题,即为什么要使用异常。

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

1
2
3
4
5
6
7
8
9
10
try
{
    x = arr1.First();
    y = arr2.First();
    z = arr3.First();
}
catch
{
    throw new ArgumentException();
}

明确强制引发异常,而不是执行null检查。


这和Int32.ParseInt32.TryParse的讨论是一样的。前者在失败时抛出异常,后者返回错误,程序继续顺利进行…