C#中集合介面關係筆記
IEnumerable
IEnumerable介面是所有集合型別的祖宗介面,其作用相當於Object型別之於其它型別。如果某個型別實現了IEnumerable介面,就意味著它可以被迭代訪問,也就可以稱之為集合型別(可列舉);
ICollection
ICollection繼承於IEnumerable介面,並且擴充套件了IEnumerable介面。
主要擴充套件的功能有:
-
新增了屬性Count,用於記錄集合元素個數
-
支援新增元素和移除元素
-
支援是否包含某元素
-
支援清空集合等等
對於任何實現了ICollection介面的集合,我們都可以通過第1條Count屬性獲取當前集合的元素數,所以這些集合也被稱為計數集合。
IList
IList介面直接繼承於ICollection介面和IEnumerable介面,並且擴充套件了通過索引操作集合的功能。
主要擴充套件的功能有:
-
通過索引獲取集合中某個元素
-
通過元素獲取元素在集合中的索引值
-
通過索引插入元素到集合指定位置
-
移除集合指定索引處的元素
IDictionary
IDictionary介面直接繼承於ICollection介面和IEnumerable介面,儲存的元素是鍵值對,擴充套件了通過鍵操作鍵值對集合的功能。
主要擴充套件的功能有:
-
通過鍵KEY獲取值VALUE
-
插入新的鍵值對{KEY:VALUE}
-
是否包含KEY
-
通過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 的操作並沒有查詢資料,而是延遲查詢