c#常用的数据结构

Array数组

内存上连续存储

数组是引用类型而不是值类型。

优点:

按照索引查询元素速度很快。

按照索引遍历数组很方便。

缺点:

声明数组时大小必须确定,且大小不能改变

添加和删除元素的速度很慢,因为需要移动其它元素。

数组只能存储一种数据类型。

一维数组的声明和创建形式:

数组类型 [ ] 数组名 = new 数组类型 [数组长度]

int [ ] one = new int [5] { 1, 2, 3, 4, 5 }; 

相当于MFC 的CArray

二维数组

int [,] one = new int [2,3];

位数组 BitArray

ArrayList 

ArrayList类相当于一种高级的动态数组,它是Array类的升级版本.本质是一个object类型的数组.ArrayList类是引用类型。连续的内存。在存和使用值类型的对象时或发生装箱/拆箱的操作。

using System.Collections;

ArrayList List=new ArrayList();

ArrayList 转Array的函数

Array ToArray(Type type);

 ArrayList List = new ArrayList();

 for (int i = 0; i < 10; i++)

       List.Add(i);

int[] values = (int[])List.ToArray(typeof(int)); //正确

List

List<T> 等效于ArrayList,性能比Arraylist高。 List的内部是用数组实现的,而不是链表,所以也是连续内存。当元素被添加到List中时,List的容量会根据需要自动增加,通过重新分配内部数组。

List<int> primeNumbers = new List<int>();

List转Array的函数

 List<int> primeNumbers = new List<int>();

 for (int i = 0; i < 10; i++)

       primeNumbers.Add(i);

  int[] Numbers = primeNumbers.ToArray();

Array转List的函数

 int[] array = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ,10};

  List<int> list = new List<int>(array);

相当于 c++ 的vector

LinkedList(双向链表)

内存非连续的、非顺序的存储结构,无法通过下标查找元素,在查找链表元素时,总是从头结点开始查找;动态调整容量。

查询复杂度为 O(n),操作复杂度为 O(1)。

遍历:

LinkedListNode<int> nowNode=linkedList.First;

while(nowNode!=null)

{

  nowNode=nowNode.Next;

}

或者

foreach(int item in linkedList)

{

  Console.WriteLine(item);

}

Array转LinkedList的函数

int[] array = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ,10};

LinkedList<int> linkedList = new LinkedList<int>(array);

相当于c++的 list

Stack(栈)

  栈是有顺序的,是一片连续的内存域,保持着先进后出的原则。

  Stack<string> numbers = new Stack<string>();

  numbers.Push("one");

  string str = numbers.Peek(); //获取不出栈

  str = numbers.Pop();//获取并出栈

Queue(队列)

先进先出,存在装箱拆箱,存储任意类型,无法获取指定位置元素,只能取出最先存储的元素。

Queue<string> queue = new Queue<string>();

//向队列中添加元素

ueue.Enqueue("老一");

queue.Enqueue("老二");

queue.Dequeue();获取并移除队列中队首的元素

queue.Peek();返回顶部的对象而不将其从队列中移除

HashSet

是基于哈希表的原理实现的,根据key直接访问存储位置的数据结构

无序、不重复;

插入、查找时间复杂度为O(1)

不使用索引;

容量不足时自动扩容,但扩容成本高;

HashSet<string> hashSet = new HashSet<string>();

hashSet.Add("123");

 hashSet.Add("456");

//转换成List集合

 hashSet.ToList();

相当于STL 的hash_set或者说unordered_set

SortedSet

基于红黑树实现有序、不重复的集合

 SortedSet<string> SortSet = new SortedSet<string>();

 SortSet.Add("123");

 hashSet.Add("456");

 foreach (var index in SortSet)

 {   

  }

//转换成List集合

SortSet.ToList();

相当于STL的set

Hashtable

基于哈希表实现,一系列基于键的哈希代码组织起来的 键/值对 。它使用键来访问集合中的元素。

特点:

key(键) 是唯一的,不可重复

只能通过 key 查询对应 的value

Hashtable hashtable = new Hashtable();

hashtable.Add(0, 1);

hashtable.Add(1, 'a');

foreach (var key in hashtable.Keys)

{

   var tablekey = key;

   var value = hashtable[key];

}

相当于STL 的unordered_map (hash_map)

Dictionary(字典)

基于哈希表实现,字典中的key值是唯一的。

字典底层将数据储存在数组里面,通过哈希函数建立Key——Value的对应关系,利用拉链法处理哈希冲突。另外,字典是线程不安全的,如果需要线程安全,需要自己加锁

Dictionary<int, string> _testDic = new Dictionary<int, string>();

     _testDic.Add(24, "Canon");

     // 注意相同相同Key值只能Add一次

     _testDic.Add(34, "Jason");                                      // foreach遍历

     foreach (var kvp in _testDic)

    {

          Console.WriteLine("Key = {0}, Value = {1}", kvp.Key, kvp.Value);

      }

相当于STL 的unordered_map (hash_map)

Dictionary和Hashtable对比

Dictionary<K,V>是泛型的,当K或V是值类型时,其速度远远超过Hashtable。

由于 Hashtable 和 Dictionary 同时存在, 在使用场景上必然存在选择性, 并不任何时刻都能相互替代.
[1] 单线程程序中推荐使用 Dictionary, 有泛型优势, 且读取速度较快, 容量利用更充分.
[2] 多线程程序中推荐使用 Hashtable, 默认的 Hashtable 允许单线程写入, 多线程读取, 对 Hashtable 进一步调用 Synchronized() 方法可以获得完全线程安全的类型. 而 Dictionary 非线程安全, 必须人为使用 lock 语句进行保护, 效率大减.
[3] Dictionary 有按插入顺序排列数据的特性 (注: 但当调用 Remove() 删除过节点后顺序被打乱), 因此在需要体现顺序的情境中使用 Dictionary 能获得一定方便.

SortedDictionary

基于使用红黑树实现的键值对集合。

特点:

有序,键唯一

只能通过 key(键) 查询对应 的 value(值) 

SortedDictionary 可对未排序的数据执行更快的插入和移除操作:它的时间复杂度为 O(log n)

 SortedDictionary<int, string> My_sdict = new SortedDictionary<int, string>();

 My_sdict.Add(004, "Ask.com");

 My_sdict.Add(003, "Yahoo");

foreach (var kvp in My_sdict)

{     

     Console.WriteLine("Key = {0}, Value = {1}", kvp.Key, kvp.Value);

  }

相当于STL的map

SortedList

排序列表是数组和哈希表的组合,使用索引访问各项,则它是一个动态数组,如果您使用键访问各项,则它是一个哈希表。集合中的各项总是按键值排序。

总结

数据结构 类型及备注 插入和删除 查找
Array 顺序存储的线性表、定长 不支持(这里的插入与删除指会更改表长的行为) O(N)
LinkedList<T> 链式存储的线性表、不定长 O(1) O(N)
List<T> 顺序存储的线性表、不定长、动态扩容 O(N),结尾则是O(1) O(N)
Stack<T> 栈、不定长、动态扩容 O(1) 只能访问栈顶
Queue<T> 队列、不定长、动态扩容 O(1) 只能访问队列头部
Dictionary<K,T> 保存键值对、使用开散列法、不定长、动态扩容、长度总为质数 O(1) O(1)
SortedList<K,T> 保存键值对、内部使用数组实现、保持有序、不定长 O(logN) O(logN)
SortedDictionary<K,T> 保存键值对、内部使用红黑树实现、保持有序、不定长 O(logN) O(logN)
HashSet<K> 使用开散列法、不定长、动态扩容、长度总为质数、是不含值的字典,故复杂度和它完全相同 O(1) O(1)
SortedSet<T> 内部使用红黑树实现、保持有序、不定长、是不含值的SortedDictionary<K,T>,故复杂度和它完全相同 O(logN) O(logN)

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

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

相关文章

10.CSS3的calc函数

CSS3 的 calc 函数 经典真题 CSS 的计算属性知道吗&#xff1f; CSS3 中的 calc 函数 calc 是英文单词 calculate&#xff08;计算&#xff09;的缩写&#xff0c;是 CSS3 的一个新增的功能。 MDN 的解释为可以用在任何长度、数值、时间、角度、频率等处&#xff0c;语法如…

【高频SQL题目】再做一遍 1164.指定日期的产品价格

题目要求&#xff1a; 产品数据表: Products ------------------------ | Column Name | Type | ------------------------ | product_id | int | | new_price | int | | change_date | date | ------------------------ (product_id, change_date)…

Spring6学习技术|Junit

学习材料 尚硅谷Spring零基础入门到进阶&#xff0c;一套搞定spring6全套视频教程&#xff08;源码级讲解&#xff09; Junit 背景 背景就是每次Test都要重复创建容器&#xff0c;获取对象。就是ApplicationContext和getBean两个语句。通过Spring整合Junit&#xff0c;可以…

二进制部署k8s集群部署的步骤总结

二进制部署k8s集群部署的步骤总结 &#xff08;1&#xff09;k8s的数据存储中中心的搭建 etcd 准备证书启动etcd服务&#xff0c;加入集群 &#xff08;2&#xff09;单机master节点的部署 准备证书和tokern文件安装 apiserver&#xff0c; controller mangerscheduler &am…

sentinel的资源数据指标是如何采集

资源数据采集 之前的NodeSelectorSlot和ClusterBuilderSlot已经完成了对资源调用树的构建, 现在则是要对资源进行收集, 核心点就是这些资源数据是如何统计 LogSlot 作用: 记录异常请求日志, 用于故障排查 public class LogSlot extends AbstractLinkedProcessorSlot<Def…

统计图雷达图绘制方法

统计图雷达图绘制方法 常用的统计图有条形图、柱形图、折线图、曲线图、饼图、环形图、扇形图。 前几类图比较容易绘制&#xff0c;饼图环形图绘制较难。 还有一种雷达图的绘制也较难&#xff0c;今提供雷达图的绘制方法供参考。 本方法采用C语言的最基本功能&#xff1a; &am…

外资并购支付牌照如何进行变更审批

孟凡富 本文首发移动支付网公众号&#xff0c;标题为外资并购支付牌照难点解析 2023年12月17日&#xff0c;《非银行支付机构监督管理条例》正式公布&#xff0c;自2024年5月1日起开始施行。根据《条例》规定&#xff0c;中华人民共和国境外的非银行机构&#xff0c;若拟为境…

【Hudi】索引

Hudi默认采用的HoodieBloomIndex索引&#xff0c;其依赖布隆过滤器来判断记录存在与否&#xff0c;当记录存在时&#xff0c;会读取实际文件进行二次判断&#xff0c;以便修正布隆过滤器带来的误差。 Hudi Bucket Index 在字节跳动的设计与实践] 1.1 索引的作用 在传统 Hive …

跟着野火学FreeRTOS:第二段(事件组)

在小节里面介绍了二进制信号量&#xff0c;计数信号量&#xff0c;互斥量和递归互斥量等功能&#xff0c;其中二进制信号量和计数信号量&#xff08;也包括队列&#xff09;常用于任务和任务之间以及任务和中断之间的同步&#xff0c;她们具有以下属性&#xff1a; 当等待的事…

Day15-Linux系统特殊权限知识精讲

Day15-Linux系统特殊权限知识精讲 为什么创建文件默认权限为644&#xff0c;目录为755&#xff1f;&#xff1f;&#xff1f; umask 权限掩码。控制系统的文件和目录的默认权限。 [rootoldboy oldboy]# umask 0022针对文件来说&#xff1a;默认权限计算方法 6 6 6 0 2 2 - …

为什么0.1+0.2不等于0.3

一、JS内部的计算是以二进制形式进行的 js里整数和小数转为二进制形式的方法是不一样的&#xff1a; 二、Number类型使用IEEE754标准64位存储 双精度浮点数&#xff08;double类型&#xff09;为每个数分配64位空间&#xff0c;并以科学计数法的方式存储&#xff1a; 那么对于…

C++入门学习(三十三)函数的定义,两数之和函数作为例子

为什么使用函数&#xff1a;将一些重复的代码封装&#xff0c;方便以后的使用&#xff0c;直接调用即可。 先给一个例子&#xff1a; // 函数返回整数类型 int addNumbers(int a, int b) { // 函数体 int sum a b; return sum; // 返回计算得到的和 } 返回值类型&…

基于卷积神经网络的图像去噪

目录 背影 卷积神经网络CNN的原理 卷积神经网络CNN的定义 卷积神经网络CNN的神经元 卷积神经网络CNN的激活函数 卷积神经网络CNN的传递函数 基于卷积神经网络的图像去噪 完整代码:基于卷积神经网络的图像去噪.rar资源-CSDN文库 https://download.csdn.net/download/abc9918351…

xrpc: 一个基于消息队列的的Go语言RPC框架

文章目录 前言XRPC的特性XRPC的实现通信编码/解码服务调用 总结 项目地址: GitHub Gitee 前言 RPC作为分布式系统中的基础组件, 使用非常广泛。大多数的RPC框架都是基于点对点的网络连接, 比如golang原生的rpc框架、grpc等. 点对点连接的通讯方式, 随着集群节点的增加, 会导致…

(全注解开发)学习Spring-MVC的第三天

全注解开发 第一部分 : 1.1 消除spring-mvc.xml 这些是原来spring-mvc.xml配置文件的内容 <!--1、组件扫描, 使Controller可以被扫描到--><context:component-scan base-package"com.itheima.controller"/><!--2、非自定义的Bean, 文件上传解析器--&…

mysql-多表查询-外连接

一、外连接查询语法 &#xff08;1&#xff09;左外连接 select 所要查询的内容 from 左表 left outer join 右表 on 条件; &#xff08;2&#xff09;右外连接 select 所要查询的内容 from 左表 right outer join 右表 on 条件; 二、示例 用以下两张表示例 左外连接 右外…

Pyglet综合应用|推箱子游戏之关卡图片载入内存

目录 读取图片 分割图片 综合应用 本篇为之前写的博客《怎样使用Pyglet库给推箱子游戏画关卡地图》的续篇&#xff0c;内容上有相关性&#xff0c;需要阅读的请见链接&#xff1a; https://hannyang.blog.csdn.net/article/details/136209138 「推箱子」是一款风靡全球的益…

c++内存的四大分区详解

目录 前言&#xff1a; 1、程序的基本运行流程 2&#xff0c;为啥要分为四个区域&#xff1f; 3&#xff0c;分为哪四个区域&#xff1f; 4&#xff0c;4个区域详解 代码区&#xff1a; 为什么会设置这两个功能呢&#xff1f; 全局区&#xff1a; 栈区&#xff1a; 堆…

system V 共享内存

1.共享内存的原理 要理解共享内存的原理&#xff0c;首先我们得记起进程间通信的前提&#xff1a;必须让不同的进程看到同一份资源&#xff08;必须由OS提供&#xff09; 我们都知道进程都会有自己的进程地址空间&#xff0c;然后都会通过页表与物理内存进行映射&#xff0c;…

图纸透明加密:保护机械图纸安全的新方法

随着信息技术的不断发展&#xff0c;机械制造行业对于图纸安全的需求越来越高。机械图纸是企业的核心竞争力之一&#xff0c;泄露可能导致严重的商业损失和技术风险。为了解决这一问题&#xff0c;图纸透明加密成为了一种新的保护机械图纸安全的方法。本文将介绍图纸透明加密的…