为什么在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上的Parse
和TryParse
方法类似。 事实上,你的问题在某些方面导致了更为笼统的问题,即为什么要使用例外。
由于First
抛出exception,因此它适用于exception提供的所有代码重用机会。 例如,你可以这样做:
try { x = arr1.First(); y = arr2.First(); z = arr3.First(); } catch { throw new ArgumentException(); }
显式强制引发exception而不是执行null
检查。
这与Int32.Parse
与Int32.TryParse
讨论相同。 如果失败,前者抛出exception,后者返回false,程序继续顺利进行……