2012-01-13 26 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或唯一电子邮件之类的内容时获取第一个项目(或仅包含项目),并且要返回默认的空项目如果没有找到您正在搜索的项目。