標籤:style blog http color 使用 os
在項目中,當我們想擷取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>)