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

时间:2011-12-03 21:20:55

标签: c# .net linq

  

可能重复:
  When to use .First and when to use .FirstOrDefault with LINQ?

当您可以使用First运算符时,在LINQ中使用FirstOrDefault运算符有什么意义?

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

3 个答案:

答案 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.ParseInt32.TryParse的讨论相同。如果失败,前者抛出异常,后者返回false并且程序继续顺利...

相关问题