1. 程式人生 > >C#中集合介面關係筆記

C#中集合介面關係筆記

IEnumerable

IEnumerable介面是所有集合型別的祖宗介面,其作用相當於Object型別之於其它型別。如果某個型別實現了IEnumerable介面,就意味著它可以被迭代訪問,也就可以稱之為集合型別(可列舉);

ICollection

ICollection繼承於IEnumerable介面,並且擴充套件了IEnumerable介面。

主要擴充套件的功能有:

  1. 新增了屬性Count,用於記錄集合元素個數

  2. 支援新增元素和移除元素

  3. 支援是否包含某元素

  4. 支援清空集合等等

對於任何實現了ICollection介面的集合,我們都可以通過第1條Count屬性獲取當前集合的元素數,所以這些集合也被稱為計數集合。

IList

IList介面直接繼承於ICollection介面和IEnumerable介面,並且擴充套件了通過索引操作集合的功能。

主要擴充套件的功能有:

  1. 通過索引獲取集合中某個元素

  2. 通過元素獲取元素在集合中的索引值

  3. 通過索引插入元素到集合指定位置

  4. 移除集合指定索引處的元素

IDictionary

IDictionary介面直接繼承於ICollection介面和IEnumerable介面,儲存的元素是鍵值對,擴充套件了通過操作鍵值對集合的功能。

主要擴充套件的功能有:

  1. 通過鍵KEY獲取值VALUE

  2. 插入新的鍵值對{KEY:VALUE}

  3. 是否包含KEY

  4. 通過KEY移除鍵值對元素

=======================================================

當我們使用到EF時,不得不說 IEnumerable(集合) 和 IQueryable(EF裡的DbSet<T>) 裡的 SQO 本質不一樣!:

      集合 的 標準查詢運算子 方法 ,是來自於 System.Linq.Enumerable 裡 給 IEnumerable 介面新增的擴充套件方法 

      EF上下文裡的 DBSet<T> 裡的 標準查詢運算子 方法,來自於 System.Linq.Queryable 裡給 IQueryable介面 新增的擴充套件方法

      EF的集合中採用IQueryable介面原因是,延遲載入,也就是我們查詢出來的並不是集合而是

IQueryable<UsersAddress> addrs = db.UsersAddresses.Where(a => a.udUId == 1);   //以介面的方式返回

      之所以返回一個介面,而不是具體的資料集合,因為我們並不知道後面是否還有查詢條件,所以採用這種方式去拼接查詢條件,如:

      addrs.Where(a=>a.mIsDel==fales);

       這個時候返回的還是介面,還是在拼接條件,並沒有生成sql語句去資料庫查詢,當我們使用到了集合中的變數時或者使用 addrs.ToList();

       就會生成SQL語句真正的去資料庫查詢資料。

IEnumerable 又叫做本地查詢,因為就是在本地記憶體中的資料集合,IQueryable 的操作並沒有查詢資料,而是延遲查詢