.Net中的集合

所有的集合都是继承自IEnumerable。集合总体可以分为以下几类:关联/非关联型集合,顺序/随机访问集合,顺序/无序集合,泛型/非泛型集合,线程集合。

各集合类底层接口关系图

在这里插入图片描述

泛型与非泛型集合类的分析

  • 泛型集合是类型安全的,基于固定的泛型T,运行时不需要像非泛型的执行Object和具体类型的类型转换。泛型集合的效率相对较高。
  • 两者都能实现数据存储,不同的是泛型只能存放T类型数据,有运行时检测,而非泛型的都转化为Object存储,能存储任意类型,包括值类型,会带来装箱拆箱的性能损耗,同时都是Object类型(弱类型)编译时无法类型检测,运行时会导致类型不一致的安全性问题。

具体接口/类分析

  • CollectionBase/DictionaryBase的目的都是抽象类,不能实例化;目的是提供给用户自定义实现强类型的集合,解决一般非泛型集合的弱类型不安全的问题。

IEnumerator和IEnumerator<T>

IEnumerator定义了我们遍历集合的基本方法,以便我们可以实现单向向前的访问集合中的每一个元素。所有的集合类都继承了IEnumerator接口,包括String类。而IEnumerable只有一个方法GetEnumerator即得到遍历器。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

ICollection和ICollection<T>

在这里插入图片描述
从最上面第一张图我们可以知道,ICollection<T>是直接继承自IEnumerable<T>。而实际上也是如此,我们可以说ICollection<T>比IEnumerable多支持一些功能,不仅仅只提供基本的遍历功能,还包括:

  • 统计集合和元素个数
  • 获取元素的下标
  • 判断是否存在
  • 添加元素到未尾
  • 移除元素等等。。。

ICollectionICollection<T>略有不同,ICollection不提供编辑集合的功能,即AddRemove。包括检查元素是否存在Contains也不支持。

IList和IList<T>

在这里插入图片描述

IList<T>则是直接继承自ICollection<T>IEnumerable<T>。所以它包括两者的功能,并且支持根据下标访问和添加元素。IndexOf, Insert, RemoveAt等等。我们可以这样说,IEnumerable支持的功能最少,只有遍历。而ICollection支持的功能稍微多一点,不仅有遍历还有维护这个集合的功能。而IList<T>是最全的版本。

IReadOnlyList

这个是在Framework4.5中新增的接口类型,可以被看作是IList的缩减版,去掉了所有可能更改这个集合的功能。比如:Add, RemoveAt等等。

IDictionary<TKey,TValue>

在这里插入图片描述
IDictionary提供了对键值对集合的访问,也是继承了ICollectionIEnumerable,扩展了通过Key来访问和操作数据的方法。

关联性泛型集合类

关联性集合类即我们常说的键值对集合,允许我们通过Key来访问和维护集合。我们先来看一下 FCL为我们提供了哪些泛型的关联性集合类:

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

Dictionary<TKey,TValue>

  • 是我们最常用的关联性集合了,它的访问,添加,删除数据所花费的时间是所有集合类里面最快的,因为它内部用了Hashtable作为存储结构,所以不管存储了多少键值对,查询/添加/删除所花费的时间都是一样的,它的时间复杂度是O(1)。
  • Dictionary<TKey,TValue>优势是查找插入速度快==,那么什么是它的劣势呢?因为采用Hashtable1作为存储结构,就意味着里面的数据是无序排列的,所以想按一定的顺序去遍历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。如果想要快速查询的同时又能很好的支持排序的话,那就使用SortedDictionary吧。

SortedList<TKey,TValue>

SortedList<TKey,TValue>是另一个支持排序的关联性集合。但是不同的地方在于,SortedList实际是将数据存存储在数组中的。也就是说添加和移除操作都是线性的,时间复杂度是O(n),因为操作其中的元素可能导致所有的数据移动。但是因为在查找的时候利用了二分搜索,所以查找的性能会好一些,时间复杂度是O(log n)。所以推荐使用场景是这样地:如果你想要快速查找,又想集合按照key的顺序排列,最后这个集合的操作(添加和移除)比较少的话,就是SortedList了。

非关联性泛型集合类

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

  • List
  • LinkedList
  • HashSet
  • SortedSet
  • Stack
  • Queue

List

  • 泛型的List 类提供了不限制长度的集合类型,List在内部维护了一定长度的数组(默认初始长度是4),当我们插入元素的长度超过4或者初始长度 的时候,会去重新创建一个新的数组,这个新数组的长度是初始长度的2倍(不永远是2倍,当发现不断的要扩充的时候,倍数会变大),然后把原来的数组拷贝过来。所以如果知道我们将要用这个集合装多少个元素的话,可以在创建的时候指定初始值,这样就避免了重复的创建新数组和拷贝值。
  • 另外的话由于内部实质是一个数组,所以在List的未必添加数据是比较快的,但是如果在数据的头或者中间添加删除数据相对来说更低效一些因为会影响其它数据的重新排列。

LinkedList

LinkedList在内部维护了一个双向的链表,也就是说我们在LinkedList的任何位置添加或者删除数据其性能都是很快的。因为它不会导致其它元素的移动。一般情况下List已经够我们使用了,但是如果对这个集合在中间的添加删除操作非常频繁的话,就建议使用LinkedList。

HashSet

HashSet是一个无序的能够保持唯一性的集合。我们也可以把HashSet看作是Dictionary<TKey,TValue>,只不过TKey和TValue都指向同一个对象。HashSet非常适合在我们需要保持集合内元素唯一性但又不需要按顺序排列的时候。HashSet不支持下标访问。

SortedSet

SortedSet和HashSet,就像SortedDictionary和Dictionary一样,还记得这两个的区别么?SortedSet内部也是一个二叉树,用来支持按顺序的排列元素。

Stack

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

Queue

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

推荐使用方式

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/216977.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

离散数学 速成

文章目录 一、命题逻辑的基本概念1. 命题2. 命题联结词 二、命题逻辑等值演算1. 等值式&#x1f330;子 2. 析取范式和合取范式&#x1f330;子 3. 主析取范式和主合取范式&#x1f330;子 4. 联结词的完备集&#x1f330;子 三、命题逻辑的推理理论&#x1f330;子 一、命题逻…

Java - Math类的常用方法及练习

目录 1.1 概述 1.2 常用方法 ❓面试题&#xff1a;为啥Math.round(-1.5)-1? 1.1 概述 java.lang.Math 类包含用于执行基本数学运算的方法&#xff0c;如初等指数、对数、平方根和三角函数。类似这样的工具类&#xff0c;其所有方法均为静态方法&#xff0c;并且不会创建对象…

优雅玩转实验室服务器(三)vscode is all you need

在前两章解决了传输问题和连接问题后&#xff0c;我们紧接着遇到一个新的需求&#xff1a;我们需要coding呀&#xff0c;你当然可以说&#xff0c;我们可以用vim和对应的插件来搭建一个IDE呀&#xff0c;fine&#xff0c;我甚至可以给你推荐如下的教程&#xff1a; Vim 到底可…

oracle详细安装教程(附带百度网盘资源)

一,下载安装包途径 1.官网 Unauthorized Request 2.百度网盘分析 https://pan.baidu.com/s/1n221gdTK0Fcho839oRab9g 提取码1q2w 二&#xff0c;安装教程 1.下载完安装包后点击 setup.exe 如果出现一下的问题&#xff0c;使用windows10等系统安装oracle 11g等版本的数据库…

实验7:索引和视图定义

【实验目的】 1、了解索引和视图的含义 2、熟悉索引和视图的创建规则 3、掌握索引和视图的创建和管理 【实验设备及器材】 1、硬件&#xff1a;PC机&#xff1b; 2、软件&#xff1a;(1)Windows7; (2)Microsoft SQL Server 2012。 【主要内容】 索引的创建、删除、重建…

【acwing】92. 递归实现指数型枚举

穿越隧道 递归枚举、位运算 方法① 从1到n&#xff0c;顺序访问每位数&#xff0c;是否选择&#xff0c;每位数有两种状态&#xff0c;选1或不选0. AC代码如下&#xff1a; #include <iostream> using namespace std;const int N 100; // bool st[N]; int n;void dfs(in…

【Oracle】backup备份时报错ORA-19809,ORA-9804

Oracle备份数据库时报错 ORA-19809: limit exceeded for recovery files ORA-19804: cannot reclaim 10305536 bytes disk space from 4385144832 limit 1.清理过时的备份&#xff1a; 使用RMAN删除不再需要的过时备份&#xff0c;以释放空间。执行以下命令&#xff1a; DEL…

Hadoop高可用(主备切换)---配合Zookeeper

1. Hadoop高可用(Hadoop High Availability)概述 HA(High Available), 高可用&#xff0c;是保证业务连续性的有效解决方案&#xff0c;一般有两个或两个以上的节点&#xff0c;分为活动节点&#xff08;Active&#xff09;及备用节点&#xff08;Standby&#xff09;。通常把…

【Qt开发流程】之2D绘图1:概述及基本绘制与填充和渐变填充

概述 Qt的绘图系统可以使用相同的API在屏幕和打印设备上进行绘图&#xff0c;并且主要基于QPainter, QPaintDevice和QPaintEngine类。 QPainter用于执行绘图操作&#xff0c;QPaintDevice是一个二维空间的抽象&#xff0c;可以使用QPainter在其上绘制&#xff0c;QPaintEngine…

《天天爱科学》期刊国家级知网投稿

《天天爱科学》国家级期刊知网收录&#xff0c;投稿方向&#xff1a;幼儿教育、基础教育文章&#xff0c;不收案例分析、教学设计、图表讲解、例题分析。 刊名&#xff1a;天天爱科学 主管单位&#xff1a;中国出版传媒股份有限公司 主办单位&#xff1a;人民文学出版社有限…

jmeter接口测试之登录测试

注册登录_登陆接口文档 1.登录 请求地址&#xff1a; POST xxxxxx/Home/Login 请求参数&#xff1a; args{LoginName:"mtest", // 登录名&#xff0c;可以为用户名或邮箱Password:"123456" // 密码" }响应数据&#xff1a; 成功 {"S…

docker 资源控制

Docker的资源控制 对容器使用宿主机的资源进行限制&#xff0c;如cpu&#xff0c;内存&#xff0c;磁盘I/O Docker使用linux自带的功能cgroup(control grouos)是linux内核系统提供的一种可以限制&#xff0c;记录&#xff0c;隔离进程组使用的物理资源 Docker借助这个机制&…

ARM:作业3

按键中断代码编写 代码: key_it.h #ifndef __KEY_IT_H__ #define __KEY_IT_H__#include "stm32mp1xx_gpio.h" #include "stm32mp1xx_exti.h" #include "stm32mp1xx_rcc.h" #include "stm32mp1xx_gic.h"void key1_it_config(); voi…

基于 ESP32-S3 的 Walter 开发板

Walter 是一款基于 ESP32-S3 且拥有 5G LTE 连接功能的新型开源开发套件。 近日&#xff0c;比利时公司 DPTechnics BV 推出了一款基于乐鑫 ESP32-S3 且拥有 5G LTE 连接功能的新型开源开发套件。该套件即将在 Crowd Supply 平台上发布&#xff0c;您可以点击此处了解详情。 无…

class068 更多的动态规划【算法】

class068 更多的动态规划【算法】 算法讲解068【必备】见识更多二维动态规划题目 code1 115. 不同的子序列 // 不同的子序列 // 给你两个字符串 s 和 t &#xff0c;统计并返回在 s 的 子序列 中 t 出现的个数 // 测试链接 : https://leetcode.cn/problems/distinct-subseque…

Mac如何设置control+space切换上一中输入法

#设置方法# *搜索输入法 系统设置-搜索&#xff1a;输入法&#xff0c;并点击键盘快捷键 *点击输入法&#xff0c;勾选&#xff1a;选择上一个输入法&#xff0c;点击完成。

漂亮的WPF界面 流行的一个界面,向上悬浮的窗口,终于试成功了

目前随便打开个APP&#xff0c;就可以看到一个悬浮的窗口 今天测试一下目前流行的一个界面&#xff0c;向上悬浮的窗口&#xff0c;终于试成功了。看着还不错的。

.net core提示The xx field is required,One or more validation errors occurred

访问接口时缺少model中的参数时&#xff0c;会提示&#xff1a; The xx field is required One or more validation errors occurred原因是.net core webapi默认参数为不可空&#xff0c;因此会验证并报错。 解决方案&#xff1a; 在项目的.csproj中&#xff0c;修改Nullable…

Leetcode—2960.统计已测试设备【简单】

2023每日刷题&#xff08;五十六&#xff09; Leetcode—2960.统计已测试设备 实现代码 int countTestedDevices(int* batteryPercentages, int batteryPercentagesSize) {int cnt 0;int ans 0;for(int i 0; i < batteryPercentagesSize; i) {int t batteryPercentage…

装机必备 | 超赞OCR文本识别小工具 Text Scanner

Text Scanner 是一款功能强大的图片扫描工具软件,该软件利用光学字符识别技术&#xff0c;来将图片上的文字内容&#xff0c;直接转换为可编辑文本&#xff0c;实用性很强。 光学字符识别&#xff08;OCR&#xff09;&#xff1a;Text Scanner for Mac采用了先进的OCR技术&…