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

來源:互聯網
上載者:User

標籤: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>)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.