首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LINQ中的DefaultIfEmpty

LINQ中的DefaultIfEmpty
EN

Stack Overflow用户
提问于 2012-01-13 16:51:06
回答 3查看 27.5K关注 0票数 36

有人能解释一下DefaultIfEmpty()如何在LINQ中使用吗?我已经准备好了一些材料,但仍然需要一些坚实的东西来看看它的用途。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-13 16:55:29

在源集合为空的情况下,它基本上返回一个带有单个元素的集合。

代码语言:javascript
复制
var numbers = new int[] {1, 2, 3};
var aNumber = numbers.First();

回报1

代码语言:javascript
复制
var numbers = new int[];
var aNumber = numbers.DefaultIfEmpty(12).Single();

返回12,因为集合为空。

票数 37
EN

Stack Overflow用户

发布于 2014-08-05 17:17:36

区别在于DefaultIfEmpty返回对象集合,而FirstOrDefault返回对象。如果没有找到结果,DefaultIfEmpty仍然返回一个具有其默认值的可枚举项,而FirstOrDefault返回T本身。

如果您总是需要一个集合结果,例如创建外部联接,您可以使用DefaultIfEmpty。如果始终需要对象(而不是集合)结果,则使用FirstOrDefault,例如,在搜索ID或唯一电子邮件时希望获取第一项(或仅获取项),如果找不到正在搜索的项,则希望返回默认的空项。

票数 8
EN

Stack Overflow用户

发布于 2021-11-12 16:57:18

DefaultIfEmpty()的一个特别有用的应用程序是避免多个枚举,在这种情况下,您不能使用Append解决空列表。

例如,假设您有一组(可能为空的)数字,并希望得到平均值。如果集合为空,则认为0是客户端代码使用的合理值。

你可以试试

代码语言:javascript
复制
var avg = numbers.Append(0).Average() ;

但这实际上并没有给出一个非空列表的正确结果!

你可以写

代码语言:javascript
复制
var avg = numbers.Any() ? numbers.Average() : 0 ;

但是这会枚举您的集合两次,如果这是一个延迟的查询,这可能是一个大问题。

代码语言:javascript
复制
var avg = numbers.DefaultIfEmpty(0).Average();

做你想做的-你得到平均值,除非列表是空的,在这种情况下,你得到0。

它也可以很好地合成,所以是这些方法的一个好的构建块.

代码语言:javascript
复制
public static T FuncOr<T>(this IEnumerable<T> items, 
                          Func<IEnumerable<T>, T> func, 
                          T fallback) 
                             => func(items.DefaultIfEmpty(fallback));

      
public static T MaxOr<T>(this IEnumerable<T> items, T fallback) 
                           => items.FuncOr(i=>i.Max(), fallback);

public static T MinOr<T>(this IEnumerable<T> items, T fallback) 
                           => items.FuncOr(i=>i.Min(), fallback);

//etc
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8854181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档