集合的操作在编码的时候很常见。但是由于经常使用几种集合。而忽略了一些不常用的集合。在这里我整理下。

首先先了解下接口:

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

.net 下的集合的更多相关文章

  1. List接口下的集合

    集合框架 List接口下的集合特点: Set接口下的集合特点: 1.都是有序的 1.都是无序的 2.都有下标 2.没有下标 3.都可以重复 3.不可重复(覆盖) List接口下的集合 1.ArrayL ...

  2. Map接口下的集合和泛型理解

    一.Map接口 1. Map接口就是最顶层了,上面没有继承了.Map是一个容器接口,它与前面学的List.Set容器不同的是前面学的这些容器,一次只能传入一个元素,但是Map容器一次可以传入一对元素( ...

  3. 大数据量下的集合过滤—Bloom Filter

    算法背景 如果想判断一个元素是不是在一个集合里,一般想到的是将集合中所有元素保存起来,然后通过比较确定.链表.树.散列表(又叫哈希表,Hash table)等等数据结构都是这种思路,存储位置要么是磁盘 ...

  4. python对redis的常用操作 下 (无序集合,有序集合)

    无序集合: 首先介绍增加,删除和获得所有元素的方法.我将会用第二部分来讨论集合的特殊操作: In [136]: x.sadd("challenge", 1,2,3,4,5,6,7, ...

  5. 你可能需要了解下Laravel集合

    前言 集合通过 Illuminate\Support\Collection 进行实例,Laravel的内核大部分的参数传递都用到了集合,但这并不代表集合就是好的.Laravel作为快捷并优雅的开发框架 ...

  6. [改善Java代码]在明确的场景下,为集合指定初始容量

    我们经常使用ArrayList,Vector,Hashmap等集合,一般都是直接用new跟上类名声明出一个集合来,然后使用add,remove,等方法进行操作,而且因为它们是自动管理长度的,所以不用我 ...

  7. Set接口下的集合

    一.集合(定义字段的时候统一使用包装类) 1.集合大类分为List.Set.Map三种,其中,List集合是有序可重复的,并且可以使用普通for循环.增强for循环.正向迭代器.双向迭代器:Set集合 ...

  8. Python学习---Python下[set集合]的学习

    Set集合[可变]是一个无序的,不重复的数据组合,它的主要作用如下: 1. 去重,把一个列表变成集合,就自动去重了 2. 关系测试,测试两组数据之前的交集.差集.并集等关系 集合(set):把不同的元 ...

  9. sqlmap win32下命令集合

    http://testphp.vulnweb.com/artists.php?artist=1    #库 注意:--前面有一个空格 C:\Python27\sqlmap>sqlmap.py - ...

随机推荐

  1. Long Long Message POJ - 2774(最长公共子串)

    题意: 给你两串字符,要你找出在这两串字符中都出现过的最长子串 解析: 先用个分隔符将两个字符串连接起来,再用后缀数组求出height数组的值,找出一个height值最大并且i与i-1的sa值分别在两 ...

  2. BZOJ 2580: [Usaco2012 Jan]Video Game

    2580: [Usaco2012 Jan]Video Game Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 142  Solved: 96[Subm ...

  3. 【模板】网络流-最大流模板(Dinic)

    #include <cstdio> #include <cstring> #include <algorithm> #include <queue> u ...

  4. Permutations II - LeetCode

    目录 题目链接 注意点 解法 小结 题目链接 Permutations II - LeetCode 注意点 不确定有几种排列 解法 解法一:因为有重复的数字所以排列的个数不确定几个,一直生成新的排列直 ...

  5. python之插入排序

    插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的.个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2).是稳定的排序方法.插入算法把要排序的数组分成两部 ...

  6. wazuh安装手册

    一.wazhu部署架构 1.服务器上运行的Agent端会将采集到的各种信息通过加密信道传输到管理端. 2.管理端负责分析从代理接收的数据,并在事件与告警规则匹配时触发警报. 3.LogStash会将告 ...

  7. FastDFS分布式存储

    分布式存储分类 通用分布式存储:mogilefs, fastdfs, ...(无文件系统接口, 通过API访问) 专用分布式存储:即分布式文件系统, moosefs, ...(有文件系统接口) GFS ...

  8. bzoj 1914: [Usaco2010 OPen]Triangle Counting 数三角形

    USACO划水中... 题目中要求经过原点的三角形数目,但这种三角形没什么明显的特点并不好求,所以可以求不经过原点的三角形数量. 对于一个非法三角形,它离原点最近的那条边连接的两个点所连的两条边一定在 ...

  9. 【数学】【CF1091D】 New Year and the Permutation Concatenation

    Description 给定一个数 \(n\),将所有 \(1~\sim~n\) 的排列按照字典序放到一个序列中,求有多少长度为 \(n\) 的子序列 \(p_i~p_{i+1}~\dots~p_{i ...

  10. UML类图与类间六种关系表示

    UML类图与类间六种关系表示 1.类与类图 类封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性,操作,关系的对象集合的总称. 类图是使用频率最高的UML图之一. 类图用于描述系统中所包含的 ...