在项目中,当我们想获取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#中何时使用Empty()和DefalutIfEmpty()的更多相关文章

  1. php中函数 isset(), empty(), is_null() 的区别,boolean类型和string类型的false判断

    php中函数 isset(), empty(), is_null() 的区别,boolean类型和string类型的false判断 实际需求:把sphinx返回的结果放到ssdb缓存里,要考虑到sph ...

  2. String中的==与Empty

    1.String中的==与Equals方法执行结果一样吗? 我们都知道对于引用类型"=="比较的是引用而不是具体的值,但c#中有一种神奇的叫做操作符重载的东西.官方对String类 ...

  3. PHP中isset和empty的区别(最后总结)

    PHP的isset()函数 一般用来检测变量是否设置 格式:bool isset ( mixed var [, mixed var [, ...]] ) 功能:检测变量是否设置 返回值: 若变量不存在 ...

  4. jQuery中删除方法empty(),remove()和detach()的区别

    empty():清空匹配的元素集合中所有的子节点,自身节点和事件都未被删除. remove():这个方法不会把匹配的元素从jQuery对象中删除,因而可以在将来再使用这些匹配的元素.但除了这个元素本身 ...

  5. jQuery中清空元素.empty()和.html(''),两种方法的对比

    jQuery 中有 .empty() 和 .html() 两种方式,都能够清空所选父元素中的所有子元素.但是这两者清空元素的方式上,有着很大的区别: 1.empty() jQuery对象.empty( ...

  6. EL表达式中null和empty的区别

    下面通过一个例子看看看null和empty的区别,建立一个test.jsp文件,内容如下: <%@page pageEncoding="utf-8" %> name:$ ...

  7. jQuery中detach&&remove&&empty三种方法的区别

    jQuery中empty&&remove&&detach三种方法的区别 empty():移除指定元素内部的所有内容,但不包括它本身 remove():移除指定元素内部的 ...

  8. php中函数 isset(), empty(), is_null() 的区别

    NULL:当你在你的脚本中写下这样一行代码 $myvariable; //此处你想定义一个变量,但未赋值.会有Notice: Undefined variable echo $myvariable + ...

  9. php 中 isset 和empty 的区别

    昨天终于开始学习php了,这个对于我来说听着很熟悉,但是学起来很陌生的东西,尤其是课上能听明白 但是真正写起了手生,都不知道手该往哪里放了,天哪~~~ 其中课上有讲到 isset和empty的区别,现 ...

随机推荐

  1. Codeforces 981D Bookshelves(按位贪心+二维DP)

    题目链接:http://codeforces.com/contest/981/problem/D 题目大意:给你n本书以及每本书的价值,现在让你把n本书放到k个书架上(只有连续的几本书可以放到一个书架 ...

  2. SQL SERVER 收缩数据库的命令

    --备份数据库 BACKUP DATABASE testdb TO DISK='d:\data\testdb20070906.bak' --清空日志 DUMP TRANSACTION testdb W ...

  3. CentOS下用yum命令安装jdk

    一.使用yum命令安装 1.查看是否已安装JDK,卸载 [root@192 ~]# yum list installed |grep java java-1.8.0-openjdk.x86_64    ...

  4. Elasticsearch5.0 安装问题

    使用Elasticsearch5.0 必须安装jdk1.8 [elsearch@vm-mysteel-dc-search01 bin]$ java -version java version &quo ...

  5. springboot 零xml集成mybatis-plus

    工程结构 pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&quo ...

  6. N的阶乘末尾有多少个0

    N的阶乘(N!)中的末尾有多少个0? N的阶乘可以分解为: 2的X次方,3的Y次方,4的5次Z方,.....的成绩.由于10 = 2 * 5,所以M只能和X和Z有关,每一对2和5相乘就可以得到一个10 ...

  7. USACO 5.5 Picture

    PictureIOI 1998 A number, N (1 <= N < 5000), of rectangular posters, photographs and other pic ...

  8. git status中文文件名编码问题解决

    在默认设置下,中文文件名在工作区状态输出,中文名不能正确显示,而是显示为八进制的字符编码. 通过将git配置变量 core.quotepath 设置为false,就可以解决中文文件名称在这些Git命令 ...

  9. forms.ModelForm 与 forms.Form

    1. 首先 两者都是forms里的常用类. 2. 这两个类在应用上是有区别的.一般情况下,如果要将表单中的数据写入数据库或者修改某些记录的值,就要让表单类继承ModelForm; 如果提交表单后 不会 ...

  10. mysql分布式集群实现原理

    做MySQL集群,例如:利用mysql cluster ,mysql proxy,mysql replication,drdb等等 有人会问mysql集群,根分表有什么关系吗?虽然它不是实际意义上的分 ...