2012-01-13 28 views
35

有人可以解釋如何在LINQ中使用DefaultIfEmpty()。我已準備好一些材料,但仍需要堅實的東西來看看它的用途。LINK中的DefaultIfEmpty

+1

你對它的用法有什麼不瞭解? – Oded 2012-01-13 16:52:44

+3

我真的不明白你會用它來做什麼。它返回'IEnumerable ',所以如果你使用了'.DefaultIfEmpty()。First()'和'.FirstOrDefault()'... [MSDN上的例子](http://msdn.microsoft.com/)。 com/en-us/library/bb360179.aspx)非常糟糕。 – Ryan 2012-01-13 16:53:49

+1

一個用法是,你不必用'if(x!= null)'測試來分解代碼。 – ChrisF 2012-01-13 16:53:55

回答

37

它基本上返回一個集合與一個單一的元素,如果源集合是空的。

var numbers = new int[] {1, 2, 3}; 
var aNumber = numbers.First(); 

返回1

var numbers = new int[]; 
var aNumber = numbers.DefaultIfEmpty(12).Single(); 

返回12作爲集合爲空

+0

哦,好的。有點傻,但是你不能''FirstOrDefault(12)'。 – Ryan 2012-01-13 17:03:22

+3

DefaultIfEmpty返回一個元素,而DefaultIfEmpty返回一個集合,然後可以級聯到鏈中的另一個linq操作。 – 2012-01-13 17:07:38

+5

@ vc74:第一個'DefaultIfEmpty'是否意味着'FirstOrDefault'(在你的評論中)? – Chris 2012-01-13 17:20:49

7

所不同的是,同時FirstOrDefault返回一個對象的DefaultIfEmpty返回對象的集合。如果沒有找到結果,則DefaultIfEmpty仍會返回帶有默認值的單個項目的Enumerable,而FirstOrDefault返回T本身。

如果您需要始終需要收集結果(例如創建外連接),則使用DefaultIfEmpty。如果您始終需要一個對象(而不是集合)結果,則使用FirstOrDefault,例如,如果要在搜索某個ID或唯一電子郵件之類的內容時獲取第一個項目(或僅包含項目),並且要返回默認的空項目如果沒有找到您正在搜索的項目。