2011-12-03 43 views
19

可能重複:
When to use .First and when to use .FirstOrDefault with LINQ?爲什麼在LINQ中使用First而不是FirstOrDefault?

什麼是使用LINQ的First操作,當你可以使用FirstOrDefault操盤手的呢?

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

我可以看到一個重複的關閉,但是......「不具有建設性」? :(儘管,我認爲這個問題可以用澄清來說明*爲什麼* First(與Error-if-empty)被認爲不如FirstOrDefault理想。 – 2011-12-03 21:42:26

回答

17

要直接回復您的具體問題(爲什麼要使用First,如果您始終可以使用FirstOrDefault),有些情況下您不能使用FirstOrDefault,因爲它丟失了信息! 「默認值」可能是源列表中的有效元素類型。除非您使用First或首先檢查是否存在需要雙枚舉的Any元素,否則無法區分枚舉中的第一個元素爲空/默認值還是列表中沒有元素。

對於值類型枚舉類型尤其如此,例如int[]default(int)0,這也很可能是數組的有效值。

通常,這兩種方法表示不同的邏輯流程。如果沒有任何元素是「特殊的」(錯誤),則會使用First,然後想要在應用程序中進行帶外處理。在這種情況下,你「期望」至少有一個元素。 FirstOrDefault在空集上返回null,這意味着您需要使用返回的值執行附加處理。這與ParseTryParse方法類似,邏輯爲int/double /等。事實上,你的問題在某種程度上導致了爲什麼要使用例外這個更普遍的問題。

由於First引發異常,因此它適用於例外情況提供的所有代碼重用機會。例如,你可以這樣做:

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

要明確強制一個例外,引起人們的關注與執行null檢查。

2

這與Int32.ParseInt32.TryParse相同。前者拋出異常,如果失敗,後者返回false,程序繼續順利...

相關問題