<代码>DefaultIfEmpty(>)特别有用的应用是,避免在你能够用<代码>Append仅处理一个空洞清单的情况下进行多次列举。
例如,认为你有一套(可能是空的)数字,需要平均价值。 如果定点为空,则你认为<代码>0为客户代码的合理价值。
你可以尝试
var avg = numbers.Append(0).Average() ;
but that doesn t actually give the correct results for a non-empty list!
页: 1
var avg = numbers.Any() ? numbers.Average() : 0 ;
但是,这两次是你确定的,如果你提出推迟的询问,那可能是大问题。
但
var avg = numbers.DefaultIfEmpty(0).Average();
只是你想要做的事——除非名单空洞,否则你就会获得平均数。
It s also nicely composable so a good building block for these kinds of methods...
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