Linq中的Empty()和DefaultIfEmpty()使用

这篇文章主要介绍了c#中Empty()和DefalutIfEmpty()用法,以实例形式分析了针对不同情况下Empty()和DefalutIfEmpty()用法区别,需要的朋友可以参考下

本文实例分析了c#中Empty()和DefalutIfEmpty()用法。分享给大家供大家参考。具体分析如下:

在项目中,当我们想获取IEnumerable<T>集合的时候,这个集合有可能是null。但通常的做法是返回一个空的集合。

假设有这样一个场景:当商店不营业时,返回一个空的IEnumerable<Product>,而当商店正常营业时,就返回一个非空的IEnumerable<Product>。

Product模型。

public class Product
 {
         public int Id { get; set; }
         public string Name { get; set; }
         public decimal Price { get; set; }
 }


该商店有一个ProductService类,该类根据属bool类型属性IsClosed来决定是否返回空的IEnumerable<Product>。

public class ProductService
 {
         public bool IsClosed { get; set; }
 
        private static IEnumerable<Product> GetAllProducts()
         {
             return new List<Product>()
             {
                 new Product(){Id = 1, Name = "Product1", Price = 85M},
                 new Product(){Id = 2, Name = "Product2", Price = 90M}
             };
         }
 
        public IEnumerable<Product> ShowProducts()
         {
             if (!IsClosed)
             {
                 return GetAllProducts();
             }
             return new List<Product>(0);
         }
 }


在客户端,假设我们设置为不营业。

class Program
 {
         static void Main(string[] args)
         {
             ProductService service = new ProductService();
             service.IsClosed = true;
 
            IEnumerable<Product> products = service.ShowProducts();
             if (products.Count() > 0)
             {
                 foreach (var prod in products)
                 {
                     Console.WriteLine("产品:{0},价格:{1}",prod.Name, prod.Price);
                 }
             }
             else
             {
                 Console.WriteLine("今天不营业~~");
             }
             Console.ReadKey();
         }
 }


 

输出结果:今天不营业~~

这样做确实没什么问题,但问题是:当通过 new List<Product>(0)返回空的集合时,为其分配了内存。对于一个只读的、空的集合类型,是否可以做到不耗费内存呢?

--答案是使用Enumerable类的静态方法Empty()。

在ProductService的ShowProducts()中修改如下

public IEnumerable<Product> ShowProducts()
 {
     if (!IsClosed)
     {
  return GetAllProducts();
     }
     return Enumerable.Empty<Product>();
 }


 

输出结果:今天不营业~~

如果在不营业的时候,我们还是想展示一些产品,比如把产品放在迎街玻璃橱窗中展示,如何做到呢?

--这时,我们可以考虑使用Enumerable类的静态类方法DefaultIfEmpty()。

继续修改ProductService,添加一个返回默认IEnumerable<Product>的方法:

private static IEnumerable<Product> GetDefaultProducts()
 {
     return new List<Product>()
     {
  new Product(){Id = 1, Name = "Product1", Price = 85M}
     };
 }

修改ProductService的ShowProducts()方法如下:

public IEnumerable<Product> ShowProducts()
 {
     if (!IsClosed)
     {
  return GetAllProducts();
     }
     return Enumerable.DefaultIfEmpty(GetDefaultProducts());
 }


 

总结:

Empty<T>和DefaultIfEmpty(IEnumerable<T>)都是Enumerable类的静态方法,给出了当返回的集合类型为空时的处理方法:

● 如果想获取一个空的集合,使用Enumerable.Empty<T>()
● 如果想给获取到的、空的集合一个默认值,使用Enumerable.DefaultIfEmpty(IEnumerable<T>)

 

转载于:http://www.jb51.net/article/57963.htm

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值