先來了解下集合的基本信息
1、BCL中集合類型分為泛型集合與非泛型集合。
2、非泛型集合的類和接口位于System.Collections命名空間。
3、泛型集合的類和接口位于System.Collections.Generic命名空間。
ICollection接口是System.Collections命名空間中非泛型集合類的基接口,它繼承自IEnumerable接口,從IEnumerable接口繼承意味著實現該接口的實現類需要實現一個枚舉器方法:GetEnumerator,該方法返回IEnumerator類型的數據。IDictionary和IList接口繼承自ICollection作為更為專用的接口,其中IDictionary接口是鍵/值對接口,它的實現如HashTable類;而IList是值的集合,其成員可通過索引訪問,如ArrayList類,次類集合與數組相比,可以認為是可變的集合,優點有,長度自動增長等。IEnumerable<T>和IEnumerable是所有集合或集合接口的基接口,所有集合接口或集合都繼承、實現了它。其中IEnumerable是最底層的接口。在非泛型集合里存放的都是System.Object類型。
一、下面列出非泛型和泛型集合的接口
非泛型集合接口 泛型集合接口 說明
ICollection ICollection<T> 定義所有集合的大小(Count),枚舉器(foreach)和同步(copyto)方法,繼承自IEnumerable
IList IList<T> 表示可按照索引單獨訪問的一組對象(像數組一樣)
IDictionary IDictionary<T> 表示鍵/值對的集合
IComparer IComparer<T> 定義類型為比較兩個對象而實現的方法
IEqualityComparer IEqualityComparer<T> 定義方法以支持對象的相等比較
IEnumerable IEnumerable<T> 公開枚舉器。實現了該接口意味著允許foreach語句循環訪問集合中的元素
IEnumerator IEnumerator<T> 支持在泛型集合上進行簡單迭代
下面來詳細介紹各種集合接口和集合。個人認為應該從根底說起。
先抱著MSDN來說IEnumerable,擴展方法就不說了,擴展方法跳過,留到學Linq的時候再說。
1、IEnumerable接口就一個方法,沒有屬性。
方法 說明
GetEnumerator 返回一個循環訪問集合的枚舉數。實現或繼承了該接口,就是為了這個方法,可以foreach遍歷。
2、IEnumerable<T>接口也一樣,也是就一個方法,沒有屬性。
方法 說明
GetEnumerator 返回一個循環訪問集合的枚舉數。
3、ICollection接口
方法 說明
CopyTo 從特定的 Array 索引處開始,將 ICollection 的元素復制到一個 Array 中。 GetEnumerator 返回一個循環訪問集合的枚舉數。 (繼承自 IEnumerable。)
屬性
Count 獲取 ICollection 中包含的元素數。 原來Count的源頭在這里。 IsSynchronized 獲取一個值,該值指示是否同步對 ICollection 的訪問(線程安全)。 SyncRoot 獲取可用于同步 ICollection 訪問的對象。
4、ICollection<T>
方法 說明
Count 獲取 ICollection<(Of <(T>)>) 中包含的元素數。 IsReadOnly 獲取一個值,該值指示 ICollection<(Of <(T>)>) 是否為只讀。
屬性
Add 將某項添加到 ICollection<(Of <(T>)>) 中。 Clear 從 ICollection<(Of <(T>)>) 中移除所有項。 Contains 確定 ICollection<(Of <(T>)>) 是否包含特定值。 CopyTo 從特定的 Array 索引開始,將 ICollection<(Of <(T>)>) 的元素復制到一個 Array 中。 GetEnumerator 已重載。 Remove 從 ICollection<(Of <(T>)>) 中移除特定對象的第一個匹配項。
這個ICollect<T>,才開始有點集合的影子了,可以Add、Clear了,怪不得它作為泛型集合接口的基類。
5、IList
IList繼承了ICollection和IEnumerable
方法 說明
Add 將某項添加到 IList 中。Clear 從 IList 中移除所有項。Contains 確定 IList 是否包含特定值。CopyTo 從特定的 Array 索引處開始,將 ICollection 的元素復制到一個 Array 中。 (繼承自 ICollection。)GetEnumerator 返回一個循環訪問集合的枚舉數。 (繼承自 IEnumerable。)IndexOf 確定 IList 中特定項的索引。Insert 將一個項插入指定索引處的 IList。Remove 從 IList 中移除特定對象的第一個匹配項。RemoveAt 移除指定索引處的 IList 項。
屬性
Count 獲取 ICollection 中包含的元素數。 (繼承自 ICollection。)IsFixedSize 獲取一個值,該值指示 IList 是否具有固定大小。IsReadOnly 獲取一個值,該值指示 IList 是否為只讀。IsSynchronized 獲取一個值,該值指示是否同步對 ICollection 的訪問(線程安全)。 (繼承自 ICollection。)Item 獲取或設置指定索引處的元素。SyncRoot 獲取可用于同步 ICollection 訪問的對象。 (繼承自 ICollection。)
可以看到,在不斷的繼承過程中,這些接口不斷地添加自己的東西,越繼承越多,越繼承越多。
6、IList<T>
IList<T>繼承了ICollection<T>,IEnumerable<T>,IEnumerable
方法 說明
Add 將某項添加到 ICollection<(Of <(T>)>) 中。 (繼承自 ICollection<(Of <(T>)>)。)Clear 從 ICollection<(Of <(T>)>) 中移除所有項。 (繼承自 ICollection<(Of <(T>)>)。)Contains 確定 ICollection<(Of <(T>)>) 是否包含特定值。 (繼承自 ICollection<(Of <(T>)>)。)CopyTo 從特定的 Array 索引開始,將 ICollection<(Of <(T>)>) 的元素復制到一個 Array 中。 (繼承自 ICollection<(Of <(T>)>)。)GetEnumerator 已重載。IndexOf 確定 IList<(Of <(T>)>) 中特定項的索引。Insert 將一個項插入指定索引處的 IList<(Of <(T>)>)。Remove 從 ICollection<(Of <(T>)>) 中移除特定對象的第一個匹配項。 (繼承自 ICollection<(Of <(T>)>)。)RemoveAt 移除指定索引處的 IList<(Of <(T>)>) 項。
屬性
Count 獲取 ICollection<(Of <(T>)>) 中包含的元素數。 (繼承自 ICollection<(Of <(T>)>)。)IsReadOnly 獲取一個值,該值指示 ICollection<(Of <(T>)>) 是否為只讀。 (繼承自 ICollection<(Of <(T>)>)。)Item 獲取或設置指定索引處的元素。
同樣,在不斷的繼承中,增加了新的東西,功能也越來越強大,支持索引獲取和設置就是IList<T>這個源頭的。一直弄不明白,NHibernate為什么會選擇這個接口來返回數據,其實這個接口的東西夠用了。
7、IDictionary<TKey,TValue>接口
IDictionary<TKey,TValue>是最底層出現的鍵/值對集合了,相當于值集合中的ICollection<T>
方法 說明
Add 已重載。Clear 從 ICollection<(Of <(T>)>) 中移除所有項。 (繼承自 ICollection<(Of <(T>)>)。)Contains 確定 ICollection<(Of <(T>)>) 是否包含特定值。 (繼承自 ICollection<(Of <(T>)>)。)ContainsKey 確定 IDictionary<(Of <(TKey, TValue>)>) 是否包含具有指定鍵的元素。CopyTo 從特定的 Array 索引開始,將 ICollection<(Of <(T>)>) 的元素復制到一個 Array 中。 (繼承自 ICollection<(Of <(T>)>)。)GetEnumerator 已重載。Remove 已重載。TryGetValue 獲取與指定的鍵相關聯的值。
屬性
Count 獲取 ICollection<(Of <(T>)>) 中包含的元素數。 (繼承自 ICollection<(Of <(T>)>)。)IsReadOnly 獲取一個值,該值指示 ICollection<(Of <(T>)>) 是否為只讀。 (繼承自 ICollection<(Of <(T>)>)。)Item 獲取或設置具有指定鍵的元素。Keys 獲取包含 IDictionary<(Of <(TKey, TValue>)>) 的鍵的 ICollection<(Of <(T>)>)。Values 獲取包含 IDictionary<(Of <(TKey, TValue>)>) 中的值的 ICollection<(Of <(T>)>)。
該接口提供的功能和ICollection<T>差不多,其實就是鍵/值對的開宗立派者。
8、IDictionary
方法 說明
Add 在 IDictionary 對象中添加一個帶有所提供的鍵和值的元素。Clear 從 IDictionary 對象中移除所有元素。Contains 確定 IDictionary 對象是否包含具有指定鍵的元素。CopyTo 從特定的 Array 索引處開始,將 ICollection 的元素復制到一個 Array 中。 (繼承自 ICollection。)GetEnumerator 已重載。Remove 從 IDictionary 對象中移除帶有指定鍵的元素。
屬性
Count 獲取 ICollection 中包含的元素數。 (繼承自 ICollection。)IsFixedSize 獲取一個值,該值指示 IDictionary 對象是否具有固定大小。IsReadOnly 獲取一個值,該值指示 IDictionary 對象是否為只讀。IsSynchronized 獲取一個值,該值指示是否同步對 ICollection 的訪問(線程安全)。 (繼承自 ICollection。)Item 獲取或設置具有指定鍵的元素。Keys 獲取 ICollection 對象,它包含 IDictionary 對象的鍵。SyncRoot 獲取可用于同步 ICollection 訪問的對象。 (繼承自 ICollection。)Values 獲取 ICollection 對象,它包含 IDictionary 對象中的值。
9、ISet<T>
ISet<T>同樣是繼承自ICollection<T>,IEnumerable<T>,IEnumerable
方法 說明
Add(T) 將某項添加到 ICollection<T> 中。 (繼承自 ICollection<T>。)Add(T) 向當前集內添加元素,并返回一個指示是否已成功添加元素的值。Clear 從 ICollection<T> 中移除所有項。 (繼承自 ICollection<T>。)Contains 確定 ICollection<T> 是否包含特定值。 (繼承自 ICollection<T>。)CopyTo 從特定的 Array 索引開始,將 ICollection<T> 的元素復制到一個 Array 中。 (繼承自 ICollection<T>。)ExceptWith 從當前集內移除指定集合中的所有元素。GetEnumerator() 返回一個循環訪問集合的枚舉數。 (繼承自 IEnumerable。)GetEnumerator() 返回一個循環訪問集合的枚舉器。 (繼承自 IEnumerable<T>。)IntersectWith 修改當前集,使該集僅包含指定集合中也存在的元素。IsPRoperSubsetOf 確定當前的設置是否正確 (嚴格) 指定集合的子集。IsProperSupersetOf 確定當前的設置是否正確 (嚴格) 指定集合中的超集。IsSubsetOf 確定一個集是否為指定集合的子集。IsSupersetOf 確定當前集是否為指定集合的超集。Overlaps 確定當前集是否與指定的集合重疊。Remove 從 ICollection<T> 中移除特定對象的第一個匹配項。 (繼承自 ICollection<T>。)SetEquals 確定當前集與指定的集合中是否包含相同的元素。SymmetricExceptWith 修改當前集,使該集僅包含當前集或指定集合中存在的元素(但不可包含兩者共有的元素)。UnionWith 修改當前設置,以使其包含當前集或指定的集合中的所有元素。
記住這些接口之間的關系,其實是非常重要的,方法和屬性記不全也無所謂,但是需要記住各自提供的功能,以及繼承關系。
先說IComparer接口,這個
新聞熱點
疑難解答