关联性集合类

关联性集合类即我们常说的键值对集合,允许我们通过Key来访问和维护集合。

我们来看一下  .net 为我们提供了哪些泛型的关联性集合类:

     Dictionary<TKey,TValue>
SortedDictionary<TKey,TValue>
SortedList<TKey,TValue>

Dictionary<TKey,TValue>

Dictionary<TKey,TValue>可能是最常用的关联性集合了,它的访问,添加,删除数据所花费的时间是所有集合类里面最快的,

因为它内部用了Hashtable作为存储结构,所以不管存储了多少键值对,查询/添加/删除所花费的时间都是一样的,它的时间复杂度是O(1)。

Dictionary<TKey,TValue>优势是查找插入速度快,那么什么是它的劣势呢?

因为采用Hashtable作为存储结构,就意味着里面的数据是无序的,所以想按一定的顺序去遍历Dictionary<TKey,TValue>里面的数据是要费一点工夫的。

作为TKey的类型必须实现 GetHashCode() 和 Equals() 或者提供一个 IEqualityComparer,否则操作可能会出现问题。

SortedDictioanry<TKey,TValue>

SortedDictionary<TKey,TValue> 和 Dictionary<TKey,TValue> 大致上是类似的,但是在实现方式上有一点点区别。

SortedDictionary<TKey,TValue>用二叉树作为存储结构。并且按key的顺序排列。

那么这样的话SortedDictionary<TKey,TValue> 的 TKey 就必须要实现 IComparable<TKey>。

如果想要快速查询的同时又能很好的支持排序的话,那就使用SortedDictionary吧。

SortedList<TKey,TValue>

SortedList<TKey,TValue>是另一个支持排序的关联性集合。不同的地方在于,SortedList实际是将数据存储在数组中的。

也就是说添加和移除操作都是线性的,时间复杂度是O(n),因为操作其中的元素可能导致所有的数据移动。

但是因为在查找的时候利用了二分搜索,所以查找的性能会好一些,时间复杂度是O(log n)。

所以推荐使用场景是这样地:如果你想要快速查找,又想集合按照key的顺序排列,最后这个集合的操作(添加和移除)比较少的话,就是 SortedList 了。

非关联性集合类

非关联性集合就是不用 key 操作的一些集合类,通常我们可以用元素本身或者下标来操作。.net 主要为我们提供了以下几种非关联性的泛型集合类。

     List<T>
LinkedList<T>
HashSet<T>
SortedSet<T>
Stack<T>
Queue<T>

List<T>

泛型的 List 类提供了不限制长度的集合类型,List在内部维护了一定长度的数组(默认初始长度是4),

当我们插入元素的长度超过 4 或者初始长度的时候,会去重新创建一个新的数组,这个新数组的长度是初始长度的2倍(不永远是2倍,当发现不断的要扩充的时候,倍数会变大)

然后把原来的数组拷贝过来。所以如果知道我们将要用这个集合装多少个元素的话,可以在创建的时候指定初始值,这样就避免了重复的创建新数组和拷贝值。

另外由于其内部实质是一个数组,所以在List的末尾添加数据是比较快的,但是如果在数据的头或者中间添加删除数据相对来说更低效一些,因为会影响其它数据的重新排列。

LinkedList<T>

LinkedList在内部维护了一个双向的链表,也就是说我们在LinkedList的任何位置添加或者删除数据其性能都是很快的。

因为它不会导致其它元素的移动。一般情况下List已经够我们使用了,但是如果对这个集合在中间的添加删除操作非常频繁的话,就建议使用 LinkedList。

HashSet<T>

HashSet是一个无序且能够保持唯一性的集合。我们也可以把 HashSe t看作是Dictionary<TKey,TValue>,只不过 TKey 和 TValue 都指向同一个对象。

HashSet非常适合在我们需要保持集合内元素唯一性但又不需要按顺序排列的时候。HashSet不支持下标访问。

HashSet的优点是占内存空间小,在检查一组数据里是否包含一个值的时候,用它就比较合适。

SortedSet<T>

SortedSet 和 HashSet 就像 SortedDictionary 和 Dictionary 一样,SortedSet内部也是一个二叉树,用来支持按顺序的排列元素。

Stack<T>

后进先出的队列,不支持按下标访问

Queu<T>

先进先出的队列,不支持按下标访问

参考:https://www.cnblogs.com/wjcx-sqh/p/6049314.html
   0http://www.runoob.com/csharp/csharp-collection.html

C# 集合类-使用的更多相关文章

  1. Java集合类--温习笔记

    最近面试发现自己的知识框架有好多问题.明明脑子里知道这个知识点,流程原理也都明白,可就是说不好,不知道是自己表达技能没点,还是确实是自己基础有问题.不管了,再巩固下基础知识总是没错的,反正最近空闲时间 ...

  2. C# - 集合类

    C#的集合类命名空间介绍: // 程序集 mscorlib.dll System.dll System.Core.dll // 命名空间 using System.Collections:集合的接口和 ...

  3. 做JavaWeb开发不知Java集合类不如归家种地

    Java作为面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储.但是使用数组存储对象方面具有一些弊端,而Java 集合就像一种容器,可以动态地把多个对象的引用放入容 ...

  4. Java基础知识笔记(八:集合类)

    目录 1  集合类简介  2  List介绍及简单使用 2.1  LinkedList介绍及简单使用 2.2  ArrayList介绍及简单使用 2.3  Vector介绍及简单使用 2.3.1  S ...

  5. [转]使用Enumeration和Iterator遍历集合类

    原文地址:http://www.cnblogs.com/xwdreamer/archive/2012/05/30/2526268.html 前言 在数据库连接池分析的代码实例中,看到其中使用Enume ...

  6. java集合类深入分析之Queue篇

    简介 Queue是一种很常见的数据结构类型,在java里面Queue是一个接口,它只是定义了一个基本的Queue应该有哪些功能规约.实际上有多个Queue的实现,有的是采用线性表实现,有的基于链表实现 ...

  7. Android开发之Java集合类性能分析

    对于Android开发者来说深入了解Java的集合类很有必要主要是从Collection和Map接口衍生出来的,目前主要提供了List.Set和 Map这三大类的集合,今天Android吧(ard8. ...

  8. 【转载】Java集合类Array、List、Map区别和联系

    Java集合类主要分为以下三类: 第一类:Array.Arrays第二类:Collection :List.Set第三类:Map :HashMap.HashTable 一.Array , Arrays ...

  9. Java 集合类的特性

    ArrayList: 元素单个,效率高,多用于查询  Vector: 元素单个,线程安全,多用于查询 LinkedList: 元素单个,多用于插入和删除  HashMap: 元素成对,元素可为空  H ...

  10. C#与Java对比学习:数据类型、集合类、栈与队列、迭达、可变参数、枚举

    数据类型: C#:String与StringBuilder Java:String与StringBuffer 第一个不习惯是string的第一个字母必须大写了. 第二个不习惯是int得写成Intege ...

随机推荐

  1. webpack构建react多页面应用

    写这个的初衷是很难找一个简洁的项目脚手架,很多脚手架都有很多依赖,光看依赖就要很久,所以自己参照网上的内容,弄个这么一个简单的多页面的脚手架. 利用creat-react-app 新建一个react应 ...

  2. APScheduler API -- apscheduler.triggers.interval

    apscheduler.triggers.interval API Trigger alias for add_job(): interval class apscheduler.triggers.i ...

  3. KL散度(Kullback–Leibler divergence)

    KL散度是度量两个分布之间差异的函数.在各种变分方法中,都有它的身影. 转自:https://zhuanlan.zhihu.com/p/22464760 一维高斯分布的KL散度 多维高斯分布的KL散度 ...

  4. httpd功能配置之虚拟主机【转】

    apache默认使用80端口提供服务,使用主服务器配置的话,一台物理机只能提供一个站点服务:可以使用虚拟主机方式提供不同的访问,以实现一台主机提供多站点服务. 虚拟主机的实现方式有三种:基于端口.基于 ...

  5. -bash: /bin/rm: Argument list too long的解决办法【转】

    当目录下文件太多时,用rm删除文件会报错: -bash: /bin/rm: Argument list too long 提示文件数目太多. 解决的办法是使用如下命令: ls | xargs -n 1 ...

  6. 我所知道的MVVM框架(转 司徒大大 )

    RubyLouvre commented on 6 Sep 2014   avalon http://avalonjs.github.io/ (使用Object.defineProperties. V ...

  7. nfs挂载出错:mount.nfs: access denied by server while mounting

    这个问题就是服务器不允许客户端去挂载,那么修改服务端的权限 $ sudo vi /etc/hosts.deny 文本末添加 ### NFS DAEMONS portmap: ALL lockd: AL ...

  8. Python匿名函数详解

    python 使用 lambda 来创建匿名函数. lambda这个名称来自于LISP,而LISP则是从lambda calculus(一种符号逻辑形式)取这个名称的. 在Python中,lambda ...

  9. Linux_僵尸进程、挂载、block块、inode号

    僵尸进程: 基本概念: 进程分为父进程和子进程 父进程一死 子进程都会死 杀死主进程的时候  子进程也会被杀死 僵尸进程:主进程被杀死了  但是子进程还活着    子进程不会占用cpu但还是会占着内存 ...

  10. Unix IPC之Posix消息队列(1)

    部分参考:http://www.cnblogs.com/Anker/archive/2013/01/04/2843832.html IPC对象的持续性:http://book.51cto.com/ar ...