.Net Framework System.Collections 集合类
本文内容
- 集合类
- 性能
最近复习了一下集合,C# 关于集合的类蛮多,但我除了 List 那几个经常用之外,其他的用得还真不多(只在小范围使用),但其实,每个集合类都各有自己适用的场景,功能也很强大。尤其是,泛型类提供的那些方法,对于集合操作很方便,比如,很多方法都把委托作为参数,包括 Action、Fun、Predicate 等,这样,就可以使用匿名函数或 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> 就比较快。
.Net Framework System.Collections 集合类的更多相关文章
- 异常:“System.Reflection.Metadata”已拥有为“System.Collections.Immutable”定义的依赖项
参考动态执行T4模板:https://msdn.microsoft.com/zh-cn/library/bb126579.aspx 我项目是.NET Framework 4.5控制台应用程序写的. 执 ...
- 关于System.Collections空间
System.Collections命名空间包含可使用的集合类和相关的接口,提供了集合的基本功能. 该命名空间下的.NET非泛型集合类如下所示: — System.Collections.ArrayL ...
- 并发集合 System.Collections.Concurrent 命名空间
System.Collections.Concurrent 命名空间提供多个线程安全集合类. 当有多个线程并发访问集合时,应使用这些类代替 System.Collections 和 System.Co ...
- System.Collections.Generic.List<T> 与 System.Collections.ArrayList
[推荐] System.Collections.Generic.List<T> [原因] 泛型集合类List<T>在操作值类型的集合时可以不进行 装箱/拆箱 处理. 使得性能较 ...
- .NETFramework:System.Collections.Generic.KeyValuePair.cs
ylbtech-.NETFramework:System.Collections.Generic.KeyValuePair.cs 定义可设置或检索的键/值对 1.返回顶部 1. #region 程序集 ...
- System.Collections.IDictionary.cs
ylbtech-System.Collections.IDictionary.cs 1.程序集 mscorlib, Version=4.0.0.0, Culture=neutral, PublicKe ...
- 【Azure 微服务】Service Fabric中微服务在升级时,遇见Warning - System.Collections.Generic.KeyNotFoundException 服务无法正常运行
问题描述 使用.Net Framework 4.5.2为架构的Service Fabric微服务应用,在升级后发布到Azure Fabric中,服务无法运行.通过Service Fabric Expl ...
- System.Collections.Generic的各容器类的用法
演示System.Collections.Generic的各容器类的用法. 包括:Dictionary,KeyValuePair,SortedDic tionary,SortedList,HashSe ...
- NHibernate无法将类型“System.Collections.Generic.IList<T>”隐式转换为“System.Collections.Generic.IList<IT>
API有一个需要实现的抽象方法: public IList<IPermission> GetPermissions(); 需要注意的是IList<IPermission>这个泛 ...
随机推荐
- WinForm通用自动更新器AutoUpdater项目实战
一.项目背景介绍 最近单位开发一个项目,其中需要用到自动升级功能.因为自动升级是一个比较常用的功能,可能会在很多程序中用到,于是,我就想写一个自动升级的组件,在应用程序中,只需要引用这个自动升级组件, ...
- 如何调试 Android 上 HTTP(S) 流量
http://greenrobot.me/devpost/how-to-debug-http-and-https-traffic-on-android/ 如何调试 Android 上 HTTP(S) ...
- WordPress主题开发:数据调用
记录在开发过程中常用的 引入标签:在一个模板文件里引用另外一个文件 get_header() get_footer() get_sidebar() get_template_part() get_se ...
- python测试开发django-32.admin后台多对多关系ManyToManyField
前言 一本书可以有多个作者,一个作者也可以写多本书,这种关系就是本篇要说的多对多关系. 这种场景在django里面数据库设计时候,需要用到ManyToManyField方法 多对多表设计 auther ...
- CentOS安装sctp协议
转自:http://blog.csdn.net/fly_yr/article/details/48375247 序 最近学习Unix网络编程,在第10章节,SCTP客户/服务器 程序实现时,发现很多由 ...
- Java并发编程的艺术(十三)——锁优化
自旋锁 背景:互斥同步对性能最大的影响是阻塞,挂起和恢复线程都需要转入内核态中完成:并且通常情况下,共享数据的锁定状态只持续很短的一段时间,为了这很短的一段时间进行上下文切换并不值得. 原理:当一条线 ...
- 使用Logstash创建ES映射模版并进行数据默认的动态映射规则
本文配置为 ELK 即(Elasticsearch.Logstash.Kibana)5.5.1. Elasticsearch 能够自动检测字段的类型并进行映射,例如引号内的字段映射为 String,不 ...
- verilog语法实例学习(3)
Verilog 操作运算符 算术运算符 +,-,*,/,**(加/减/乘/除/幂运算),乘法运算的结果的位宽是乘数和被乘数位宽的和. 在进行整数的除法运算时,结果要略去小数部分,只取整数部分:而进行取 ...
- [leetcode]Maximum Subarray @ Python
原题地址:https://oj.leetcode.com/problems/maximum-subarray/ 题意: Find the contiguous subarray within an a ...
- Longest Palindromic Substring leetcode java
题目: Given a string S, find the longest palindromic substring in S. You may assume that the maximum l ...