c#中Empty()和DefalutIfEmpty()用法分析
本文實(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 int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
該商店有一個(gè)ProductService類,該類根據(jù)屬bool類型屬性IsClosed來(lái)決定是否返回空的IEnumerable<Product>。
{
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è)。
{
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í)沒什么問(wèn)題,但問(wèn)題是:當(dāng)通過(guò) new List<Product>(0)返回空的集合時(shí),為其分配了內(nèi)存。對(duì)于一個(gè)只讀的、空的集合類型,是否可以做到不耗費(fèi)內(nèi)存呢?
--答案是使用Enumerable類的靜態(tài)方法Empty()。
在ProductService的ShowProducts()中修改如下:
{
if (!IsClosed)
{
return GetAllProducts();
}
return Enumerable.Empty<Product>();
}
輸出結(jié)果:今天不營(yíng)業(yè)~~
如果在不營(yíng)業(yè)的時(shí)候,我們還是想展示一些產(chǎn)品,比如把產(chǎn)品放在迎街玻璃櫥窗中展示,如何做到呢?
--這時(shí),我們可以考慮使用Enumerable類的靜態(tài)類方法DefaultIfEmpty()。
繼續(xù)修改ProductService,添加一個(gè)返回默認(rèn)IEnumerable<Product>的方法:
{
return new List<Product>()
{
new Product(){Id = 1, Name = "Product1", Price = 85M}
};
}
修改ProductService的ShowProducts()方法如下:
{
if (!IsClosed)
{
return GetAllProducts();
}
return Enumerable.DefaultIfEmpty(GetDefaultProducts());
}

總結(jié):
Empty<T>和DefaultIfEmpty(IEnumerable<T>)都是Enumerable類的靜態(tài)方法,給出了當(dāng)返回的集合類型為空時(shí)的處理方法:
● 如果想獲取一個(gè)空的集合,使用Enumerable.Empty<T>()
● 如果想給獲取到的、空的集合一個(gè)默認(rèn)值,使用Enumerable.DefaultIfEmpty(IEnumerable<T>)
希望本文所述對(duì)大家的C#程序設(shè)計(jì)有所幫助。
相關(guān)文章
C#實(shí)現(xiàn)大數(shù)字運(yùn)算的實(shí)例代碼
這篇文章介紹了C#實(shí)現(xiàn)大數(shù)字運(yùn)算的實(shí)例代碼,有需要的朋友可以參考一下2013-10-10
C# 動(dòng)畫窗體(AnimateWindow)的小例子
C# 動(dòng)畫窗體(AnimateWindow)的小例子,需要的朋友可以參考一下2013-03-03
Jquery+Ajax+Json+存儲(chǔ)過(guò)程實(shí)現(xiàn)高效分頁(yè)
這篇文章主要介紹Jquery+Ajax+Json+存儲(chǔ)過(guò)程實(shí)現(xiàn)分頁(yè),需要的朋友可以參考下2015-08-08
C#實(shí)現(xiàn)單鏈表(線性表)完整實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)單鏈表(線性表)的方法,結(jié)合完整實(shí)例形式分析了單鏈表的原理、實(shí)現(xiàn)方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2016-06-06
c# 使用Task實(shí)現(xiàn)非阻塞式的I/O操作
這篇文章主要介紹了c# 使用Task實(shí)現(xiàn)非阻塞式的I/O操作,幫助大家更好的理解和學(xué)習(xí)c# 編程語(yǔ)言,感興趣的朋友可以了解下2020-11-11
C# KeyUp事件中MessageBox的回車(Enter)鍵回調(diào)問(wèn)題解決方案
這篇文章主要介紹了C# KeyUp事件中MessageBox的回車(Enter)鍵回調(diào)問(wèn)題解決方案,需要的朋友可以參考下2014-07-07

