這篇文章主要介紹了c#中Empty()和DefalutIfEmpty()用法,以實(shí)例形式分析了針對(duì)不同情況下Empty()和DefalutIfEmpty()用法區(qū)別,需要的朋友可以參考下
本文實(shí)例分析了c#中Empty()和DefalutIfEmpty()用法。分享給大家供大家參考。具體分析如下:
在項(xiàng)目中,當(dāng)我們想獲取IEnumerable<T>集合的時(shí)候,這個(gè)集合有可能是null。但通常的做法是返回一個(gè)空的集合。
假設(shè)有這樣一個(gè)場(chǎng)景:當(dāng)商店不營(yíng)業(yè)時(shí),返回一個(gè)空的IEnumerable<PRoduct>,而當(dāng)商店正常營(yíng)業(yè)時(shí),就返回一個(gè)非空的IEnumerable<Product>。
Product模型。
public class Product { public int Id { get; set; } public string Name { get; set; } public decimal Price { get; set; } }該商店有一個(gè)ProductService類(lèi),該類(lèi)根據(jù)屬bool類(lèi)型屬性IsClosed來(lái)決定是否返回空的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); } }在客戶端,假設(shè)我們?cè)O(shè)置為不營(yíng)業(yè)。
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("產(chǎn)品:{0},價(jià)格:{1}",prod.Name, prod.Price); } } else { Console.WriteLine("今天不營(yíng)業(yè)~~"); } Console.ReadKey(); } }
輸出結(jié)果:今天不營(yíng)業(yè)~~
這樣做確實(shí)沒(méi)什么問(wèn)題,但問(wèn)題是:當(dāng)通過(guò) new List<Product>(0)返回空的集合時(shí),為其分配了內(nèi)存。對(duì)于一個(gè)只讀的、空的集合類(lèi)型,是否可以做到不耗費(fèi)內(nèi)存呢?
--答案是使用Enumerable類(lèi)的靜態(tài)方法Empty()。
在ProductService的ShowProducts()中修改如下
public IEnumerable<Product> ShowProducts() { if (!IsClosed) { return GetAllProducts(); } return Enumerable.Empty<Product>(); }
輸出結(jié)果:今天不營(yíng)業(yè)~~
如果在不營(yíng)業(yè)的時(shí)候,我們還是想展示一些產(chǎn)品,比如把產(chǎn)品放在迎街玻璃櫥窗中展示,如何做到呢?
--這時(shí),我們可以考慮使用Enumerable類(lèi)的靜態(tài)類(lèi)方法DefaultIfEmpty()。
繼續(xù)修改ProductService,添加一個(gè)返回默認(rèn)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()); }
總結(jié):
Empty<T>和DefaultIfEmpty(IEnumerable<T>)都是Enumerable類(lèi)的靜態(tài)方法,給出了當(dāng)返回的集合類(lèi)型為空時(shí)的處理方法:
● 如果想獲取一個(gè)空的集合,使用Enumerable.Empty<T>()● 如果想給獲取到的、空的集合一個(gè)默認(rèn)值,使用Enumerable.DefaultIfEmpty(IEnumerable<T>)
轉(zhuǎn)載于:http://www.jb51.net/article/57963.htm
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注