.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>。

相关文章
相关标签/搜索