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

可能重复:
何时使用.First和何时使用.FirstOrDefault和LINQ?

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

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

要直接回答您的具体问题(为什么使用First如果您始终可以使用FirstOrDefault ),有些情况下您无法使用FirstOrDefault ,因为它丢失了信息! “默认值”可能是源列表中的有效元素类型。 您无法区分枚举中的第一个元素为null / default与列表中没有元素,除非您使用First或首先检查是否存在Any元素,这需要双枚举。

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

通常,这两种方法代表不同的逻辑流程。 如果没有任何元素是“例外”(错误),则First使用它,然后在您的应用程序中处理带外。 在这种情况下,您“期望”至少拥有一个元素。 FirstOrDefault在空集上返回null,这意味着您需要使用返回的值执行其他处理。 这与int / double / etc上的ParseTryParse方法类似。 事实上,你的问题在某些方面导致了更为笼统的问题,即为什么要使用例外。

由于First抛出exception,因此它适用于exception提供的所有代码重用机会。 例如,你可以这样做:

 try { x = arr1.First(); y = arr2.First(); z = arr3.First(); } catch { throw new ArgumentException(); } 

显式强制引发exception而不是执行null检查。

这与Int32.ParseInt32.TryParse讨论相同。 如果失败,前者抛出exception,后者返回false,程序继续顺利进行……