本文内容

  • 集合类
  • 性能

最近复习了一下集合,C# 关于集合的类蛮多,但我除了 List 那几个经常用之外,其他的用得还真不多(只在小范围使用),但其实,每个集合类都各有自己适用的场景,功能也很强大。尤其是,泛型类提供的那些方法,对于集合操作很方便,比如,很多方法都把委托作为参数,包括 ActionFunPredicate 等,这样,就可以使用匿名函数或 Lamda 表达式编程,代码很简洁,应该多试试,再用以前的 for 循环遍历就有点 out 了~

一般的集合类都在 System.Collections System.Collections.Generic 命名空间里,前者是非泛型集合,后则是泛型集合;线程安全的集合类位于 System.Collections.Concurrent 命名空间。

下载 Demo

集合类


集合,都是一些《数据结构》中常见的结构,比如,列表、队列、栈、双向链表、字典、散列等等,其中,列表、双向链表、字典、散列还有有序和无序之分等等。

其实,.Net 提供的每个集合类都继承了相应的接口,不同接口的组合,就会出现不同的集合类。

集合

描述

ArrayList,List<T>

列表,List<T> 是 ArrayList  的泛型形式。

Stack<T>

Queue<T>

队列

HashSet<T>,SortedSet<T>

集,包含不重复元素的集合成为“集(set)”.

其中,HashSet<T> 集合包含不重复元素的无序列表;SortedSet<T> 集合包含不重复元素的有序列表。

LinkedList<T>

双向链表

Dictionary<TKey, TValue>

字典,允许按照某个键来访问元素。字典也称为映射或散列表。字典的主要特征是能根据键快速查找值。也可以自由添加和删除元素,这有点 List<T> 类,但没有在内存中移动后续元素的性能开销。

SortedDictionary<TKey, TValue>

有序字典,是一个二叉搜索树,其中的元素根据键来排序。该键类型必须实现 IComparable<TKey> 接口。

SortedList<TKey, TValue>

有序链表,该类按照键给元素排序。

性能


每个集合类类型,对不同的操作,性能也不同。实际项目中,可以综合考虑下。

集合

Add

Insert

Remove

Item

Sort

Find

List<T>

如果集合必须重置大小,就是 O(1) 或 O(n)

O(n)

O(n)

O(1)

O(n log n),最坏情况 O(n^2)

O(n)

Stack<T>

Push(),如果栈必须重置大小,就是 O(1) 或 O(n)

N/A

Pop()

O(1)

N/A

N/A

N/A

Queue<T>

Enqueue(),如果队列必须重置大小,就是 O(1) 或 O(n)

N/A

Dequeue()

O(1)

N/A

N/A

N/A

HashSet<T>

如果集必须重置大小,就是 O(1) 或 O(n)

Add()

O(1) 或 O(n)

O(1)

N/A

N/A

N/A

LinkedList<T>

AddLast()

O(1)

AddAfter()

O(1)

O(1)

N/A

N/A

O(n)

Dictionary<TKey, TValue>

O(1) 或 O(n)

N/A

O(1)

O(1)

N/A

N/A

SortedDictionary<TKey, TValue>

O(log n)

N/A

O(log n)

O(log n)

N/A

N/A

SortedList<TKey, TValue>

无序数据为 O(n),如果必须重置大小,到列表的尾部就是 O(log n)

N/A

O(n)

读写是 O(log n),如果键在列表中,就是 O(log n),否则,就是 O(n)

N/A

N/A

* 注意:N/A 表示该操作不能应用于这种集合类型。

其中,

  • O(1) 表示无论集合中有多少数据项,这个操作需要的时间都不变;
  • O(n) 表示对于集合中的每个元素,需要增加的时间都是相同的;
  • O(log n) 表示操作需要的时间随集合中元素的增加而增加,但每个元素需要增加的时间,不是线性的,而不是呈对数曲线。

如何看这张表:

  • 什么是“重置大小”,当集合的容量不够时,每次都会将列表的容量重新设置为原来的2倍。也就是,如果集合的容量是 4,当添加第 5 个元素后,容量就变成 8,当添加第 9 个元素后,容量就变成 16……;
  • List<T> 列表,是比较基本的一个,除了排序,时间复杂度大都是线性的,而且索引访问的时间复杂度是 O(1);
  • Stack 和 Queue,入栈和入队列,是 O(1) 或 O(n);出栈和出队列,是在栈定和对头进行,所以是 O(1);插入、索引器、排序、查找这些操作,栈和队列是不支持的;
  • LinkedList<T> 双向链表,它的优点是插入很快,但是查找较慢,因为要一个接一个访问。不支持索引和排序操作;
  • SortedList<TKey, TValue> 是有序列表,无论你以怎么添加,元素都是按键给排好序的;
  • Dictionary<TKey, TValue> 是一般用途的字典,将键映射到值上,所以它的添加、删除、索引的速度很快;
  • SortedDictionary<TKey, TValue> 是有序的字典,一个二叉搜索树。SortedDictionary<TKey, TValue> 跟 SortedList<TKey, TValue>功能类似,但 SortedList<TKey, TValue> 实现为一个基于数组的链表;而 SortedDictionary<TKey, TValue>实现为一个字典,所以它们有不同的特性:
    • SortedList<TKey, TValue> 使用的内存比 SortedDictionary<TKey, TValue> 少;
    • SortedDictionary<TKey, TValue> 的插入和删除速度比较快;
    • 在用已排好序的数据填充集合时,若不需要修改容量,SortedList<TKey, TValue> 就比较快。

下载 Demo

.Net Framework System.Collections 集合类的更多相关文章

  1. 异常:“System.Reflection.Metadata”已拥有为“System.Collections.Immutable”定义的依赖项

    参考动态执行T4模板:https://msdn.microsoft.com/zh-cn/library/bb126579.aspx 我项目是.NET Framework 4.5控制台应用程序写的. 执 ...

  2. 关于System.Collections空间

    System.Collections命名空间包含可使用的集合类和相关的接口,提供了集合的基本功能. 该命名空间下的.NET非泛型集合类如下所示: — System.Collections.ArrayL ...

  3. 并发集合 System.Collections.Concurrent 命名空间

    System.Collections.Concurrent 命名空间提供多个线程安全集合类. 当有多个线程并发访问集合时,应使用这些类代替 System.Collections 和 System.Co ...

  4. System.Collections.Generic.List<T> 与 System.Collections.ArrayList

    [推荐] System.Collections.Generic.List<T> [原因] 泛型集合类List<T>在操作值类型的集合时可以不进行 装箱/拆箱 处理. 使得性能较 ...

  5. .NETFramework:System.Collections.Generic.KeyValuePair.cs

    ylbtech-.NETFramework:System.Collections.Generic.KeyValuePair.cs 定义可设置或检索的键/值对 1.返回顶部 1. #region 程序集 ...

  6. System.Collections.IDictionary.cs

    ylbtech-System.Collections.IDictionary.cs 1.程序集 mscorlib, Version=4.0.0.0, Culture=neutral, PublicKe ...

  7. 【Azure 微服务】Service Fabric中微服务在升级时,遇见Warning - System.Collections.Generic.KeyNotFoundException 服务无法正常运行

    问题描述 使用.Net Framework 4.5.2为架构的Service Fabric微服务应用,在升级后发布到Azure Fabric中,服务无法运行.通过Service Fabric Expl ...

  8. System.Collections.Generic的各容器类的用法

    演示System.Collections.Generic的各容器类的用法. 包括:Dictionary,KeyValuePair,SortedDic tionary,SortedList,HashSe ...

  9. NHibernate无法将类型“System.Collections.Generic.IList<T>”隐式转换为“System.Collections.Generic.IList<IT>

    API有一个需要实现的抽象方法: public IList<IPermission> GetPermissions(); 需要注意的是IList<IPermission>这个泛 ...

随机推荐

  1. [置顶] Android系统移植与调试之------->build.prop文件详细赏析

    小知识:什么是build.prop?   /system/build.prop 是一个属性文件,在Android系统中.prop文件很重要,记录了系统的设置和改变,类似於/etc中的文件.这个文件是如 ...

  2. Revit Family API 添加几何实体

    先创建一个封闭曲线createProfileLShape();再创建实体,这里需要手工画一个参考平面; ; i < nVerts; ++i)        {            Line l ...

  3. 为什么我不再用 .NET 框架

    .NET平台很棒.真的很棒.直到它不再那么棒.我为什么不再用.NET?简单来说,它限制了我们选择的能力(对我来说很重要),转移了我们的注意力,使得我们向内认知它的安全性,替代了帮助我们认知外面广阔世界 ...

  4. Quartz.NET简介

    Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用.Quartz可以用来创建简单或为运行十个,百个, ...

  5. UnityEngine.Time类属性解析

    UnityEngine.Time类包含的属性: public static int captureFramerate { get; set; } public static float deltaTi ...

  6. mysql error You must reset your password using ALTER USER statement before executing this statement.

    mysql修改密码Your password does not satisfy the current policy requirements 出现这个问题的原因是:密码过于简单.刚安装的mysql的 ...

  7. nginx 获取自定义header头部信息

    为了排查线上的bug,需要在nginx的日志中,打印客户端上传上来的header头部信息,同时头部信息是自定义的.在尝试多重方案后,找到解决方法: log_format dm '"$remo ...

  8. 豪斯医生第一季/全集House M.D 1迅雷下载

    豪斯医生 第一季 House M.D. Season 1 (2004)本季看点:态度无礼,表情凶恶,跛足拄着一根藤棍,永远是牛仔裤运动鞋的便装打扮而不是整洁的白大褂,普林斯顿大学附属医院的格雷戈·豪斯 ...

  9. 详细解读Volley(二)—— ImageRequest & Request简介

    上篇文章我们讲到了如何用volley进行简单的网络请求,我们可以很容易的接受到string.JsonObjec类型的返回结果,之前的例子仅仅是一次请求,这里需要说明volley本身就是适合高并发的,所 ...

  10. Python数据分析笔记

    最近在看Python数据分析这本书,随手记录一下读书笔记. 工作环境 本书中推荐了edm和ipython作为数据分析的环境,我还是刚开始使用这种集成的环境,觉得交互方面,比传统的命令行方式提高了不少. ...