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#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 Async .net 多线程 Thread ThreadPool Task .Net 反射学习
- C#订阅与发布标准实现 visual studio code .net 开发 设计模式之☞策略模式 C#字符串转二进制、二进制转字符串 c# 接口的协变和逆变 c# 使用迭代器来创建可枚举类型 博客园首页新随笔联系订阅管理 随笔 - 117 文章 - 0 评论 - 57 c# 创建,加载,修改XML文档
- c#封装DBHelper类 c# 图片加水印 (摘)C#生成随机数的三种方法 使用LINQ、Lambda 表达式 、委托快速比较两个集合,找出需要新增、修改、删除的对象 c# 制作正方形图片 JavaScript 事件循环及异步原理(完全指北)
- XML序列化 判断是否是手机 字符操作普通帮助类 验证数据帮助类 IO帮助类 c# Lambda操作类封装 C# -- 使用反射(Reflect)获取dll文件中的类型并调用方法 C# -- 文件的压缩与解压(GZipStream)
- 反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) C#中缓存的使用 C#操作redis WPF 控件库——可拖动选项卡的TabControl 【Bootstrap系列】详解Bootstrap-table AutoFac event 和delegate的分别 常见的异步方式async 和 await C# Task用法 c#源码的执行过程
- 【卷土重来之C#学习笔记】(二)c#编程概述
- Word处理控件Aspose.Words功能演示:如何在 C# .NET 中将 PNG、JPG 转换为 Word
- C#截取字符串,分割字符串,替换字符串,删除字符串指定位置的字符
- C#进阶
- C#【高级篇】 C# 多线程
- C#,字符串匹配(模式搜索)AC(Aho Corasick)算法的源代码
- C# linq to entity中字段转化为指定类型 lambda 字段类型转换 解决"LINQ to Entities does not recognize the method 'System.String ToString(Int32)' method, and this method cannot be translated into a store expression."
- C#生成城市按照一定格式且按字母顺序的方法
- C# 浅拷贝与深拷贝区别 解惑篇
- c# Mono.Cecil IL方式 读MethodBody
- 《C#零基础入门之百识百例》(三十八)常用方法 -- Math类
- 《C#零基础入门之百识百例》(七十一)委托介绍 -- 战士升级示例
- C# 字符串的截取拆分
- C# 字符串类型介绍与操作
- C# Monitor:锁定资源
- C# 多线程 异步加载 窗体
- 【C#】AddHandler可重复多次添加事件处理器的问题