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 |
- 我可以看到一个副本的结束,但是…"不是建设性的?(尽管如此,我认为这个问题可以澄清为什么认为First比FirstOrDefault更不理想(如果为空则有错误)。
为了直接回答您的特定问题(如果您总是可以使用FirstOrDefault,为什么要使用First),有些情况下您不能使用FirstOrDefault,因为它会丢失信息!"默认值"可能是源列表中的有效元素类型。您无法区分枚举中第一个元素为空/默认与列表中没有元素,除非您使用First或首先检查是否有需要双重枚举的Any元素。
对于值类型的可枚举项(如int[])尤其如此。default(int)是0,也是数组的有效值。
通常,这两种方法代表不同的逻辑流。如果没有任何元素是"异常的"(一个错误),那么将使用First,它随后希望在应用程序中处理带外的问题。在这个场景中,您"期望"至少有一个元素。FirstOrDefault返回空集合的空值,这意味着您需要对返回的值进行额外的处理。这与Parse和TryParse方法在int和double等方面的逻辑相似。实际上,您的问题在某些方面导致了更普遍的问题,即为什么要使用异常。
由于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.Parse和Int32.TryParse的讨论是一样的。前者在失败时抛出异常,后者返回错误,程序继续顺利进行…