c#中何时使用Empty()和DefalutIfEmpty()

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

在项目中,当我们想获取IEnumerable<T>集合的时候,这个集合有可能是null。但通常的做法是返回一个空的集合。

假设有这样一个场景:当商店不营业时,返回一个空的IEnumerable<PRoduct>,而当商店正常营业时,就返回一个非空的IEnumerable<Product>。

Product模型。

publicclassProduct

{publicintId {get;set; }publicstringName {get;set; }publicdecimalPrice {get;set; }

}

该商店有一个ProductService类,该类根据属bool类型属性IsClosed来决定是否返回空的IEnumerable<Product>。

publicclassProductService

{publicboolIsClosed {get;set; }privatestaticIEnumerable<Product>GetAllProducts()

{returnnewList<Product>()

{newProduct(){Id =1, Name ="Product1", Price =85M},newProduct(){Id =2, Name ="Product2", Price =90M}

};

}publicIEnumerable<Product>ShowProducts()

{if(!IsClosed)

{returnGetAllProducts();

}returnnewList<Product>(0);

}

}

在客户端,假设我们设置为不营业。

classProgram

{staticvoidMain(string[] args)

{

ProductService service=newProductService();

service.IsClosed=true;

IEnumerable<Product> products =service.ShowProducts();if(products.Count() >0)

{foreach(varprodinproducts)

{

Console.WriteLine("产品:{0},价格:{1}",prod.Name, prod.Price);

}

}else{

Console.WriteLine("今天不营业~~");

}

Console.ReadKey();

}

}

输出结果:今天不营业~~

这样做确实没什么问题,但问题是:当通过 new List<Product>(0)返回空的集合时,为其分配了内存。对于一个只读的、空的集合类型,是否可以做到不耗费内存呢?

--答案是使用Enumerable类的静态方法Empty()。

在ProductService的ShowProducts()中修改如下:publicIEnumerable<Product>ShowProducts()

{if(!IsClosed)

{returnGetAllProducts();

}returnEnumerable.Empty<Product>();

}

输出结果:今天不营业~~

如果在不营业的时候,我们还是想展示一些产品,比如把产品放在迎街玻璃橱窗中展示,如何做到呢?

--这时,我们可以考虑使用Enumerable类的静态类方法DefaultIfEmpty()。

继续修改ProductService,添加一个返回默认IEnumerable<Product>的方法:

privatestaticIEnumerable<Product>GetDefaultProducts()

{returnnewList<Product>()

{newProduct(){Id =1, Name ="Product1", Price =85M}

};

}

修改ProductService的ShowProducts()方法如下:

publicIEnumerable<Product>ShowProducts()

{if(!IsClosed)

{returnGetAllProducts();

}returnEnumerable.DefaultIfEmpty(GetDefaultProducts());

}

总结

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

● 如果想获取一个空的集合,使用Enumerable.Empty<T>()

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

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航