2013-07-17 175 views
4

當我設置一個默認值,如果設置爲空,並呼籲.FirstOrDefault()與不滿足我沒有收到我的默認值的條件,但類型的默認值:FirstOrDefault返回意外值

int[] list = { 1, 2, 3, 4, 5 }; 
Console.WriteLine(list.DefaultIfEmpty(1).FirstOrDefault(i => i == 4)); // Outputs 4, as expected 
Console.WriteLine(list.DefaultIfEmpty(1).FirstOrDefault(i => i > 5)); // Outputs 0, why?? 

這似乎很不直觀,因爲我將.DefaultIfEmpty()設置爲1.爲什麼不輸出1?

+5

整數的默認值(因爲沒有找到)是一個0. –

+0

爲什麼不用我使用'.DefaultIfEmpty'設置的值,因爲沒有返回的值符合條件? –

+3

因爲'DefaultIfEmpty'適用於'list'而不是結果。 – Romoku

回答

12

您似乎誤解了DefaultIfEmpty的工作原理。

list.DefaultIfEmpty(1)如果源集合(list)爲空,返回包含1的單例序列。由於list不爲空,因此不起作用,並返回源序列。

其結果是,查詢實際上是相同的:

int result = list.FirstOrDefault(i => i > 5); 

int默認爲0所以FirstOrDefault返回0如果條件不滿足,它不是因爲list不包含元素,更大大於5

你可以得到你想要使用的行爲:

int result = list.Cast<int?>().FirstOrDefault(i => i > 5) ?? 1; 
1

整數的缺省值是0

FirstOrDefault返回第一個發生或默認值,在你的情況下,你重新使用int,所以它是0。如果您想要在沒有物品時發生異常,請嘗試使用First(x => x > 5)

1

FirstOrDefault指的是表達式default(T)的值,其中T是集合的類型,而不是列表的第一個值。您無法更改該行爲,也無法更改某個類型的默認值。

1

的默認值表不可爲空INT默認值爲0。由於沒有在你的列表是> 5,它返回默認值。

0

DefaultIfEmpty不設置默認值。如果原始列表爲空,它將爲您提供一個列表,其中包含此值作爲默認值。

9

這是你在找什麼:

Console.WriteLine(list.Where(i => i > 5).DefaultIfEmpty(1).First()); 

通過DefaultIfEmpty前放置Where,一個空的集合會返回一個枚舉一個項目。然後您可以使用First來獲取該元素。

+0

謝謝,是的,這是我期待的行爲。 –