码迷,mamicode.com
首页 > 其他好文 > 详细

c#中何时使用Empty()和DefalutIfEmpty()

时间:2014-07-14 23:01:37      阅读:266      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   使用   os   

在项目中,当我们想获取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());
        }

bubuko.com,布布扣

 

  总结

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

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

c#中何时使用Empty()和DefalutIfEmpty(),布布扣,bubuko.com

c#中何时使用Empty()和DefalutIfEmpty()

标签:style   blog   http   color   使用   os   

原文地址:http://www.cnblogs.com/darrenji/p/3842383.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!