可能重複:
When to use .First and when to use .FirstOrDefault with LINQ?爲什麼在LINQ中使用First而不是FirstOrDefault?
什麼是使用LINQ的First
操作,當你可以使用FirstOrDefault
操盤手的呢?
var q = results.First(); // Error if empty
可能重複:
When to use .First and when to use .FirstOrDefault with LINQ?爲什麼在LINQ中使用First而不是FirstOrDefault?
什麼是使用LINQ的First
操作,當你可以使用FirstOrDefault
操盤手的呢?
var q = results.First(); // Error if empty
要直接回復您的具體問題(爲什麼要使用First
,如果您始終可以使用FirstOrDefault
),有些情況下您不能使用FirstOrDefault
,因爲它丟失了信息! 「默認值」可能是源列表中的有效元素類型。除非您使用First
或首先檢查是否存在需要雙枚舉的Any
元素,否則無法區分枚舉中的第一個元素爲空/默認值還是列表中沒有元素。
對於值類型枚舉類型尤其如此,例如int[]
。 default(int)
是0
,這也很可能是數組的有效值。
通常,這兩種方法表示不同的邏輯流程。如果沒有任何元素是「特殊的」(錯誤),則會使用First
,然後想要在應用程序中進行帶外處理。在這種情況下,你「期望」至少有一個元素。 FirstOrDefault
在空集上返回null,這意味着您需要使用返回的值執行附加處理。這與Parse
與TryParse
方法類似,邏輯爲int
/double
/等。事實上,你的問題在某種程度上導致了爲什麼要使用例外這個更普遍的問題。
由於First
引發異常,因此它適用於例外情況提供的所有代碼重用機會。例如,你可以這樣做:
try
{
x = arr1.First();
y = arr2.First();
z = arr3.First();
}
catch
{
throw new ArgumentException();
}
要明確強制一個例外,引起人們的關注與執行null
檢查。
這與Int32.Parse
與Int32.TryParse
相同。前者拋出異常,如果失敗,後者返回false,程序繼續順利...
我可以看到一個重複的關閉,但是......「不具有建設性」? :(儘管,我認爲這個問題可以用澄清來說明*爲什麼* First(與Error-if-empty)被認爲不如FirstOrDefault理想。 – 2011-12-03 21:42:26