c#中Empty()和DefalutIfEmpty()用法分析

作者:shichen2014 时间:2022-05-20 12:58:55 

本文实例分析了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());
}

c#中Empty()和DefalutIfEmpty()用法分析

总结:

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

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

希望本文所述对大家的C#程序设计有所帮助。

标签:c#,用法
0
投稿

猜你喜欢

  • SpringMVC统一异常处理实例代码

    2021-05-31 02:29:26
  • 浅谈抛出异常和捕获异常的一些区别

    2023-10-19 15:25:24
  • Java数据结构之优先级队列(PriorityQueue)用法详解

    2023-11-18 13:00:50
  • Java NIO深入分析

    2022-12-29 03:50:27
  • SpringMVC @RequestMapping注解详解

    2022-08-08 06:58:14
  • Spring Security自定义登录原理及实现详解

    2022-11-20 21:57:39
  • Java持久化框架Hibernate与Mybatis优劣及选择详解

    2023-12-03 19:46:14
  • SpringBoot设置编码UTF-8的两种方法

    2022-05-04 00:09:08
  • 分布式医疗挂号系统SpringCache与Redis为数据字典添加缓存

    2023-06-28 02:26:55
  • Idea中SpringBoot多模块项目的建立实现

    2023-11-08 07:52:34
  • SpringBoot新手入门的快速教程

    2021-09-28 23:23:25
  • java并发编程_线程池的使用方法(详解)

    2023-03-29 22:23:00
  • Spring中的REST分页的实现代码

    2023-03-16 01:06:46
  • C#中using语句的用法

    2023-07-02 05:33:24
  • Mybatis selectKey 如何返回新增用户的id值

    2022-07-14 05:10:38
  • 详解Android Activity中的几种监听器和实现方式

    2022-11-02 11:26:05
  • java web服务器实现跨域访问

    2023-09-17 06:55:08
  • 详解SpringCloud Config配置中心

    2021-06-18 04:38:34
  • 浅谈C#中Md5和Sha1两种加密方式

    2023-04-01 20:25:11
  • C#检测远程计算机端口是否打开的方法

    2023-12-11 08:55:31
  • asp之家 软件编程 m.aspxhome.com