有人能解释一下DefaultIfEmpty()如何在LINQ中使用吗?我已经准备好了一些材料,但仍然需要一些坚实的东西来看看它的用途。
发布于 2012-01-13 16:55:29
在源集合为空的情况下,它基本上返回一个带有单个元素的集合。
var numbers = new int[] {1, 2, 3};
var aNumber = numbers.First();回报1
但
var numbers = new int[];
var aNumber = numbers.DefaultIfEmpty(12).Single();返回12,因为集合为空。
发布于 2014-08-05 17:17:36
区别在于DefaultIfEmpty返回对象集合,而FirstOrDefault返回对象。如果没有找到结果,DefaultIfEmpty仍然返回一个具有其默认值的可枚举项,而FirstOrDefault返回T本身。
如果您总是需要一个集合结果,例如创建外部联接,您可以使用DefaultIfEmpty。如果始终需要对象(而不是集合)结果,则使用FirstOrDefault,例如,在搜索ID或唯一电子邮件时希望获取第一项(或仅获取项),如果找不到正在搜索的项,则希望返回默认的空项。
发布于 2021-11-12 16:57:18
DefaultIfEmpty()的一个特别有用的应用程序是避免多个枚举,在这种情况下,您不能使用Append解决空列表。
例如,假设您有一组(可能为空的)数字,并希望得到平均值。如果集合为空,则认为0是客户端代码使用的合理值。
你可以试试
var avg = numbers.Append(0).Average() ;但这实际上并没有给出一个非空列表的正确结果!
你可以写
var avg = numbers.Any() ? numbers.Average() : 0 ;但是这会枚举您的集合两次,如果这是一个延迟的查询,这可能是一个大问题。
但
var avg = numbers.DefaultIfEmpty(0).Average();做你想做的-你得到平均值,除非列表是空的,在这种情况下,你得到0。
它也可以很好地合成,所以是这些方法的一个好的构建块.
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);
//etchttps://stackoverflow.com/questions/8854181
复制相似问题