zoukankan      html  css  js  c++  java
  • 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());
            }

    1

      总结

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

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

  • 相关阅读:
    红黑树——面试相关
    汇编常用指令
    c++11 delete禁用函数
    【转】C++可变参数列表处理宏va_list、va_start、va_end的使用
    【转】C/C++函数调用过程分析
    引用的大小
    多线程面试
    2017.08.22网易面试问题记录
    c++ 重载->
    探究Java如何实现原子操作(atomic operation)
  • 原文地址:https://www.cnblogs.com/darrenji/p/3842383.html
Copyright © 2011-2022 走看看