.net 下的集合

集合的操做在編碼的時候很常見。可是因爲常用幾種集合。而忽略了一些不經常使用的集合。在這裏我整理下。算法

首先先了解下接口:數組

一、IEnumerable,返回一個循環訪問集合的枚舉器。安全

二、IEnumerable<T>,返回一個循環訪問指定集合T的枚舉器。多線程

三、ICollection,在IEnumerable基礎上,增長了是否同步操做中、支持同步操做、能夠拿到數量、拷貝到另一個集合的方法。併發

四、ICollection<T>,是ICollection的泛型。而且多了新增,清除,包含等接口方法。函數

五、IList,在繼承原來的接口上,新增了索引器、集合是否可讀、插入、移除接口方法。編碼

六、IList<T>,是IList接口的泛型,功能都有,只是有些功能在ICollection<T>裏實現了。spa

七、IReadOnlyCollection<T>,提供一個強類型的只讀元素集合接口。.net

 八、IReadOnlyList<T>,在IReadOnlyCollection<T>接口基礎上增長了索引。線程

 九、IDictionary,以 鍵/值對 來存儲的接口。

 十、ISet<T>,基於繼承的接口之上,新增了ExceptWith(從當前集內移除指定集合中的全部元素)、IntersectWith(修改當前集,使該集僅包含指定集合中也存在的元素)、IsProperSubsetOf(肯定當前集是否爲指定集合的屬性子集)、IsProperSupersetOf(肯定當前集是否爲指定集合的正確超集)、IsSubsetOf(肯定一個集是否爲指定集合的子集)、IsSupersetOf(肯定當前集是否爲指定集合的超集)、Overlaps(肯定當前集是否與指定的集合重疊)、SymmetricExceptWith(修改當前集,使該集僅包含當前集或指定集合中存在的元素,但不可包含二者共有的元素)、UnionWith(修改當前集,使該集包含當前集和指定集合中同時存在的全部元素)。

1、在System.Collections命名空間下的集合有:

一、ArrayList。

ArrayList集合繼承的接口有IList, ICollection, IEnumerable, ICloneable。從繼承的接口來看,存放的是object類型的集合。支持集合的同步、克隆等操做。與數組不一樣的是,數組是固定大小的,而集合是可變長的。

二、BitArray。

BitArray是一個密封類,管理一個緊湊型的位值數組,繼承於ICollection, IEnumerable, ICloneable三個接口。和ArrayList不一樣的是他存放的是byte[]。

三、Queue、

隊列,繼承ICollection, IEnumerable, ICloneable這三個接口。隊列表明着 先進先出(FIFO)的集合,傳入的是object對象。支持同步操做。

四、Stack

堆棧,繼承ICollection, IEnumerable, ICloneable三個接口,表明着後進先出(LIFO)的集合,傳入的是object對象。支持同步操做。

五、SortedList、

排序列表,是按照鍵/值對來排序的集合。繼承於IDictionary, ICollection, IEnumerable, ICloneable這4個接口,從add方法中 public virtual void Add(object key, object value),看出添加的是鍵和值,值能夠經過索引來獲取。每添加一個鍵值對,就會按照鍵做爲升序排序。

六、Hashtable

哈希表,也是鍵/值對集合。繼承於IDictionary, ICollection, IEnumerable, ISerializable, IDeserializationCallback, ICloneable6個接口,和SortedList不一樣的是當用鍵訪問元素時是使用的哈希表,也就是添加鍵值對的時候,鍵是經過哈希算法得到的惟一值,可是在添加key的時候是不引許添加劇復的key,這樣的轉換過的鍵也就不可以直接排序了。但能夠經過ArrayList來排序(new ArrayList(hashtable.keys).Sort())。

2、在System.Collections.Generic命名空間下的集合有:

一、Dictionary<TKey, TValue>

字典,鍵值對集合,繼承的接口有:IDictionary<TKey, TValue>, ICollection<KeyValuePair<TKey, TValue>>, IDictionary, ICollection, IReadOnlyDictionary<TKey, TValue>, IReadOnlyCollection<KeyValuePair<TKey, TValue>>, IEnumerable<KeyValuePair<TKey, TValue>>, IEnumerable, ISerializable, IDeserializationCallback,其中KeyValuePair是struct類型用來存key/value值。

二、List<T>

泛型集合。繼承的接口有IList<T>, ICollection<T>, IList, ICollection, IReadOnlyList<T>, IReadOnlyCollection<T>, IEnumerable<T>, IEnumerable 8個接口,裏面有public int BinarySearch(T item)方法 ,該方法是在集合查找該元素,返回從零開始的索引,然而它須要使用一個排過序的集合,來經過二分查找來查詢,而Find、Contains、indexOf方法都是線性查找,在數據量很大的狀況下,二分查找的效率比線性查找快,由於它的複雜度爲O(logn)。

三、HashSet<T>

 繼承於ISerializable, IDeserializationCallback, ISet<T>, ICollection<T>, IEnumerable<T>, IEnumerable 6個接口,和Hashtable不一樣的是,Hashtable繼承的是IDictionary接口,因此存取的是鍵值對。而HashSet<T>是存取強類型的值。若是集合須要求交集、並集、差集,HashSet<T>比較適合。這裏強調下HashSet<T>不接受重複對象的。

四、 LinkedList<T>

鏈表集合,繼承於ICollection<T>, IEnumerable<T>, ICollection, IEnumerable, ISerializable, IDeserializationCallback 6個接口,它和List<T>的不一樣是,它的添加是相似鏈表同樣,在給定的節點基礎上先後添加一個新的節點值。方法有AddBefore、AddAfter、AddFirst、AddLast等,第一次添加的時候是用AddFirst方法或者傳入構造函數裏面。

五、Queue<T>

泛型隊列,繼承於IEnumerable<T>, ICollection, IEnumerable 3個接口,和Queue不一樣的是,一個是泛型(強類型),一個是object類型(存取須要拆箱、裝箱),且在多線程的狀況下須要本身實現同步操做。

六、Stack<T>

泛型堆棧,繼承於IEnumerable<T>, ICollection, IEnumerable 3個接口,和Stack不一樣的也是泛型和非泛型的區別,且在多線程的狀況下須要本身實現同步操做。

七、SortedList<TKey, TValue>

鍵值對集合,繼承於 IDictionary<TKey, TValue>, ICollection<KeyValuePair<TKey, TValue>>, IEnumerable<KeyValuePair<TKey, TValue>>, IDictionary, ICollection, IEnumerable 6個接口,是泛型的。不能夠添加相同的key,添加後會自動按升序排序。固然能夠經過IComparer<TKey>來比較排序。

八、SortedSet<T>

帶有排序的集合,繼承於ISet<T>, ICollection<T>, IEnumerable<T>, ICollection, IEnumerable, ISerializable, IDeserializationCallback 7個接口,和HashSet<T> 相似,只是添加值後會自動排序。

九、SortedDictionary<TKey, TValue>

帶有排序的鍵值對集合,繼承於 IDictionary<TKey, TValue>, ICollection<KeyValuePair<TKey, TValue>>, IEnumerable<KeyValuePair<TKey, TValue>>, IDictionary, ICollection, IEnumerable 6個接口,經過構造函數傳入比較器來自定義排序。

十、KeyedByTypeCollection<TItem>

在 程序集 System.ServiceModel下,提供一個集合,該集合的項是用做鍵的類型,繼承的是KeyedCollection<TKey, TItem>抽象類而KeyedCollection<TKey, TItem>繼承的是Collection<T>類。

十一、SynchronizedCollection<T>

在程序集 System.ServiceModel 下,繼承於IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable 6個接口,提供一個線程安全集合,其中包含泛型參數所指定類型的對象做爲元素,構造函數裏面能夠傳入同步線程安全的對象。

十二、SynchronizedReadOnlyCollection<T>

在程序集 System.ServiceModel 下,繼承於 IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable 6個接口,提供一個線程安全只讀集合,該集合包含泛型參數所指定的類型的對象做爲元素,構造函數裏面能夠傳入同步線程安全的對象。

3、在System.Collections.Concurrent命名空間下有:

該命名空間下提供多個線程安全集合類,可是用多線程併發訪問集合時,應該使用這些類。注意:只有.net Framework 4及以上纔有

一、ConcurrentDictionary<TKey, TValue>

表示可由多個線程同時訪問的鍵值對的線程安全集合,比Dictionary<TKey, TValue> 多了幾個TryAdd、TryRemove、TryUpdate等方法。

二、ConcurrentQueue<T>

表示線程安全的先進先出(FIFO)集合。

三、ConcurrentStack<T>

表示線程安全的後進先出(LIFO)集合

四、BlockingCollection<T>

爲實現IProducerConsumerCollection<T>的線程安全集合提供阻塞和限制功能。

五、ConcurrentBag<T>

 表示對象的線程安全的無序集合,

四 在System.Collections.ObjectModel命名空間下有:

一、ReadOnlyCollection<T>

提供泛型只讀集合的基類

二、ObservableCollection<T>

主要在WPF中使用,但添加、刪除或刷新整個列表時,此集合將提供通知。繼承於Collection<T>, INotifyCollectionChanged, INotifyPropertyChanged。

三、ReadOnlyObservableCollection<T>

只讀的ObservableCollection<T>。

相關文章
相關標籤/搜索