.net 下的集合
集合的操作在編碼的時候很常見。但是由于經常使用幾種集合。而忽略了一些不常用的集合。在這里我整理下。
首先先了解下接口:
1、IEnumerable,返回一個循環訪問集合的枚舉器。
2、IEnumerable<T>,返回一個循環訪問指定集合T的枚舉器。
3、ICollection,在IEnumerable基礎上,增加了是否同步操作中、支持同步操作、可以拿到數量、拷貝到另外一個集合的方法。
4、ICollection<T>,是ICollection的泛型。并且多了新增,清除,包含等接口方法。
5、IList,在繼承原來的接口上,新增了索引器、集合是否可讀、插入、移除接口方法。
6、IList<T>,是IList接口的泛型,功能都有,只是有些功能在ICollection<T>里實現了。
7、IReadOnlyCollection<T>,提供一個強類型的只讀元素集合接口。
?8、IReadOnlyList<T>,在IReadOnlyCollection<T>接口基礎上增加了索引。
?9、IDictionary,以 鍵/值對 來存儲的接口。
?10、ISet<T>,基于繼承的接口之上,新增了ExceptWith(從當前集內移除指定集合中的所有元素)、IntersectWith(修改當前集,使該集僅包含指定集合中也存在的元素)、IsProperSubsetOf(確定當前集是否為指定集合的屬性子集)、IsProperSupersetOf(確定當前集是否為指定集合的正確超集)、IsSubsetOf(確定一個集是否為指定集合的子集)、IsSupersetOf(確定當前集是否為指定集合的超集)、Overlaps(確定當前集是否與指定的集合重疊)、SymmetricExceptWith(修改當前集,使該集僅包含當前集或指定集合中存在的元素,但不可包含兩者共有的元素)、UnionWith(修改當前集,使該集包含當前集和指定集合中同時存在的所有元素)。
一、在System.Collections命名空間下的集合有:
1、ArrayList。
ArrayList集合繼承的接口有IList,?ICollection,?IEnumerable,?ICloneable。從繼承的接口來看,存放的是object類型的集合。支持集合的同步、克隆等操作。與數組不同的是,數組是固定大小的,而集合是可變長的。
2、BitArray。
BitArray是一個密封類,管理一個緊湊型的位值數組,繼承于ICollection,?IEnumerable,?ICloneable三個接口。和ArrayList不同的是他存放的是byte[]。
3、Queue、
隊列,繼承ICollection,?IEnumerable,?ICloneable這三個接口。隊列代表著 先進先出(FIFO)的集合,傳入的是object對象。支持同步操作。
4、Stack
堆棧,繼承ICollection,?IEnumerable,?ICloneable三個接口,代表著后進先出(LIFO)的集合,傳入的是object對象。支持同步操作。
5、SortedList、
排序列表,是按照鍵/值對來排序的集合。繼承于IDictionary,?ICollection,?IEnumerable,?ICloneable這4個接口,從add方法中?public?virtual?void?Add(object?key,?object?value),看出添加的是鍵和值,值可以通過鍵和索引來獲取。每添加一個鍵值對,就會按照鍵作為升序排序。
6、Hashtable
哈希表,也是鍵/值對集合。繼承于IDictionary,?ICollection,?IEnumerable,?ISerializable,?IDeserializationCallback,?ICloneable6個接口,和SortedList不同的是當用鍵訪問元素時是使用的哈希表,也就是添加鍵值對的時候,鍵是通過哈希算法獲得的唯一值,但是在添加key的時候是不引許添加重復的key,這樣的轉換過的鍵也就不能夠直接排序了。但可以通過ArrayList來排序(new?ArrayList(hashtable.keys).Sort())。
)
二、在System.Collections.Generic命名空間下的集合有:
1、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值。
2、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)。
3、HashSet<T>
?繼承于ISerializable, IDeserializationCallback, ISet<T>, ICollection<T>, IEnumerable<T>, IEnumerable 6個接口,和Hashtable不同的是,Hashtable繼承的是IDictionary接口,所以存取的是鍵值對。而HashSet<T>是存取強類型的值。如果集合需要求交集、并集、差集,HashSet<T>比較適合。這里強調下HashSet<T>不接受重復對象的。
4、?LinkedList<T>
鏈表集合,繼承于ICollection<T>, IEnumerable<T>, ICollection, IEnumerable, ISerializable, IDeserializationCallback 6個接口,它和List<T>的不同是,它的添加是類似鏈表一樣,在給定的節點基礎上前后添加一個新的節點值。方法有AddBefore、AddAfter、AddFirst、AddLast等,第一次添加的時候是用AddFirst方法或者傳入構造函數里面。
5、Queue<T>
泛型隊列,繼承于IEnumerable<T>, ICollection, IEnumerable 3個接口,和Queue不同的是,一個是泛型(強類型),一個是object類型(存取需要拆箱、裝箱),且在多線程的情況下需要自己實現同步操作。
6、Stack<T>
泛型堆棧,繼承于IEnumerable<T>, ICollection, IEnumerable 3個接口,和Stack不同的也是泛型和非泛型的區別,且在多線程的情況下需要自己實現同步操作。
7、SortedList<TKey, TValue>
鍵值對集合,繼承于?IDictionary<TKey, TValue>, ICollection<KeyValuePair<TKey, TValue>>, IEnumerable<KeyValuePair<TKey, TValue>>, IDictionary, ICollection, IEnumerable 6個接口,是泛型的。不可以添加相同的key,添加后會自動按升序排序。當然可以通過IComparer<TKey>來比較排序。
8、SortedSet<T>
帶有排序的集合,繼承于ISet<T>, ICollection<T>, IEnumerable<T>, ICollection, IEnumerable, ISerializable, IDeserializationCallback 7個接口,和HashSet<T> 類似,只是添加值后會自動排序。
9、SortedDictionary<TKey, TValue>
帶有排序的鍵值對集合,繼承于?IDictionary<TKey, TValue>, ICollection<KeyValuePair<TKey, TValue>>, IEnumerable<KeyValuePair<TKey, TValue>>, IDictionary, ICollection, IEnumerable 6個接口,通過構造函數傳入比較器來自定義排序。
10、KeyedByTypeCollection<TItem>
在 程序集 System.ServiceModel下,提供一個集合,該集合的項是用作鍵的類型,繼承的是KeyedCollection<TKey, TItem>抽象類而KeyedCollection<TKey, TItem>繼承的是Collection<T>類。
11、SynchronizedCollection<T>
在程序集 System.ServiceModel 下,繼承于IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable 6個接口,提供一個線程安全集合,其中包含泛型參數所指定類型的對象作為元素,構造函數里面可以傳入同步線程安全的對象。
12、SynchronizedReadOnlyCollection<T>
在程序集 System.ServiceModel 下,繼承于?IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable 6個接口,提供一個線程安全只讀集合,該集合包含泛型參數所指定的類型的對象作為元素,構造函數里面可以傳入同步線程安全的對象。
三、在System.Collections.Concurrent命名空間下有:
該命名空間下提供多個線程安全集合類,但是用多線程并發訪問集合時,應該使用這些類。注意:只有.net Framework 4及以上才有。
1、ConcurrentDictionary<TKey, TValue>
表示可由多個線程同時訪問的鍵值對的線程安全集合,比Dictionary<TKey, TValue> 多了幾個TryAdd、TryRemove、TryUpdate等方法。
2、ConcurrentQueue<T>
表示線程安全的先進先出(FIFO)集合。
3、ConcurrentStack<T>
表示線程安全的后進先出(LIFO)集合
4、BlockingCollection<T>
為實現IProducerConsumerCollection<T>的線程安全集合提供阻塞和限制功能。
5、ConcurrentBag<T>
?表示對象的線程安全的無序集合,
四 在System.Collections.ObjectModel命名空間下有:
1、ReadOnlyCollection<T>
提供泛型只讀集合的基類
2、ObservableCollection<T>
主要在WPF中使用,但添加、刪除或刷新整個列表時,此集合將提供通知。繼承于Collection<T>, INotifyCollectionChanged, INotifyPropertyChanged。
3、ReadOnlyObservableCollection<T>
只讀的ObservableCollection<T>。
轉載于:https://www.cnblogs.com/dingli/p/6531729.html
總結
- 上一篇: 世界上速度最快的鱼能游多快(海洋里速度最
- 下一篇: 申请办理原产地证需要哪些资料?