当前位置: 首页 > 编程笔记 >

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

穆毅然
2023-03-14
本文向大家介绍c#中Empty()和DefalutIfEmpty()用法分析,包括了c#中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>)

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

 类似资料:
  • 本文向大家介绍C ++ STL中的map :: empty(),包括了C ++ STL中的map :: empty()的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们将讨论C ++ STL中map::empty()函数的工作,语法和示例。 什么是C ++ STL中的映射? 映射是关联容器,它有助于按特定顺序存储由键值和映射值的组合形成的元素。在映射容器中,数据始终在内部借助其关联的键进行排

  • 本文向大家介绍C#中OpenFileDialog和PictrueBox的用法分析,包括了C#中OpenFileDialog和PictrueBox的用法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#中OpenFileDialog和PictrueBox的用法。分享给大家供大家参考。具体用法分析如下: 先来看看这段代码: resultFile 就能得到你选中文件的路径 OpenFile

  • 本文向大家介绍C#中is和as用法实例分析,包括了C#中is和as用法实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#中is和as的用法,对加深is与as用法的理解有一定的帮助借鉴作用。具体如下: 现来看个例子: 这样会报错(InvalidCastException),由于C#安全机制,它会去判断一次。我们这里做了非法的转换。 Is做判断:is说判断对象是不是你要的那个类型(这

  • 本文向大家介绍C#中分部方法和分部类分析,包括了C#中分部方法和分部类分析的使用技巧和注意事项,需要的朋友参考一下 本文实例分析了C#中分部方法和分部类。分享给大家供大家参考。 具体代码如下: 希望本文所述对大家的C#程序设计有所帮助。

  • 本文向大家介绍C ++ STL中的multiset empty()函数,包括了C ++ STL中的multiset empty()函数的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们将讨论C ++ STL中multiset::empty()函数的工作原理,语法和示例。 什么是C ++ STL中的多重集? 多重集是类似于集合容器的容器,这意味着它们以与集合相同的键的形式按特定顺序存储值。 在

  • 本文向大家介绍C#中Activator.CreateInstance()方法用法分析,包括了C#中Activator.CreateInstance()方法用法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#中Activator.CreateInstance()方法用法。分享给大家供大家参考。具体分析如下: Activator 类 包含特定的方法,用以在本地或从远程创建对象类型,或获