淘宝建设网站的,网站制作开票几个点,东莞商务网站建设,代做网站平台前言在Dotnet开发过程中#xff0c;DefaultIfEmpty作为IEnumerable的扩展方法#xff0c;十分常用。本文对DefaultIfEmpty方法的关键源码进行简要分析#xff0c;以方便大家日后更好的使用该方法。使用DefaultIfEmpty 返回 IEnumerable T 的元素#xff1b;如果序列… 前言在Dotnet开发过程中DefaultIfEmpty作为IEnumerable的扩展方法十分常用。本文对DefaultIfEmpty方法的关键源码进行简要分析以方便大家日后更好的使用该方法。使用DefaultIfEmpty 返回 IEnumerable T 的元素如果序列为空则返回一个具有默认值的单例类集合。假如我们有这样的一个集合如果集合的元素为空我们给该集合添加一个默认元素.public class UserInforMation{public string UserName { get; set; }public string Sex { get; set; }}ListUserInforMation lstUserInforMations new ListUserInforMation();不使用Linq 我们可能会这样写private ListUserInforMation DefaultIfEmpty(ListUserInforMation userInforMations, UserInforMation defaultUser){if (userInforMations null){throw new Exception(数据源为空);}if (userInforMations.Any()){return userInforMations;}else{userInforMations.Add(defaultUser);return userInforMations;}
}使用LinqlstUserInforMations.DefaultIfEmpty(new UserInforMation { UserName 张三, Sex 男 });源码解析方法public static IEnumerableTSource DefaultIfEmptyTSource(IEnumerableTSource source, TSource defaultValue)参数source 返回的序列。defaultValue 序列为空时要返回的默认值。返回值IEnumerable TSource 如果 source 为空则为包含 defaultValue 的 IEnumerable T否则为 source。此方法通过使用延迟执行来实现,因为IEnumerable是延迟加载的每次访问的时候才取值。所以我们在返回数据时需要使用yield由于我们需要判断当前集合是否有元素所以我们需要使用到GetEnumerator()源码public static IEnumerableTSource DefaultIfEmptyTSource(IEnumerableTSource source, TSource defaultValue){if (source null){throw new Exception(source is null);}using (IEnumeratorTSource e source.GetEnumerator()){if (e.MoveNext()){do{yield return e.Current;}while (e.MoveNext());}else{yield return defaultValue;}}}总结此方法本人用于处理空集合。该方法显示默认值而不是显示错误。ListUserInforMation lstUserInforMations new ListUserInforMation();
var userInfor lstUserInforMations.FirstOrDefault();
if (userInfor null){userInfor new UserInforMation { UserName 张三, Sex 男 };}使用DefaultIfEmpty可以让代码变得更优雅一点ListUserInforMation lstUserInforMations new ListUserInforMation();var userInfor lstUserInforMations.DefaultIfEmpty(new UserInforMation { UserName 张三, Sex 男 }).First();大家要是有更好的使用技巧欢迎交流独乐乐不如众乐乐本篇就说到这里啦希望对您有帮助。