unity C#中Array、Stack、Queue、Dictionary、HashSet优缺点和使用场景总结

文章目录

  • 数组 (Array)
  • 列表 (List<T>)
  • 栈 (Stack<T>)
  • 队列 (Queue<T>)
  • 链表 (LinkedList<T>)
  • 哈希表 (Dictionary<TKey, TValue>) 或 HashSet<T>
  • 集合 (Collection<T>)

数组 (Array)

优点

  • 高效访问:通过索引可以直接访问任何位置的元素,时间复杂度为O(1)。
  • 连续内存空间:对于CPU缓存友好,能够实现快速的连续读取和遍历操作。
int[] numbers = new int[5] { 1, 2, 3, 4, 5 };
Console.WriteLine(numbers[0]); // 输出 "1"
  • 缺点
    • 固定大小:创建时必须指定大小,且一旦创建后不能改变容量。
    • 插入删除效率低:在数组中间插入或删除元素需要移动其他元素,时间复杂度通常为O(n)。

列表 (List)

优点

  • 动态扩容:自动根据需要增加或减少容量,适用于元素数量不固定的场景。
  • 丰富的操作:提供Add、Insert、Remove等方法,并支持索引访问。
List<int> numbers = new List<int>();
numbers.Add(1);
numbers.Insert(0, 0); // 在开头插入元素
numbers.RemoveAt(1); // 删除第二个元素
  • 缺点
    • 随机插入删除成本:虽然比数组更灵活,但大量插入和删除可能导致性能降低(平均情况下插入和删除的时间复杂度为O(n))。

栈 (Stack)

  • 优点
    • 后进先出 (LIFO):适合用于撤销操作、递归调用栈等场景。
    • 基础操作高效:Push和Pop操作的时间复杂度均为O(1)。
Stack<int> stack = new Stack<int>();
stack.Push(1);
stack.Push(2);
int topItem = stack.Pop(); // 返回并移除最后一个压入的元素
  • 缺点
    • 受限的数据结构:仅支持特定类型的堆栈操作,不适合需要双向或多向访问的需求。

队列 (Queue)


- **优点**:- **先进先出 (FIFO)**:适用于任务排队、消息传递等场景。- **基础操作高效**:Enqueue和Dequeue操作的时间复杂度也为O(1)。```csharp
Queue<int> queue = new Queue<int>();
queue.Enqueue(1);
queue.Enqueue(2);
int frontItem = queue.Dequeue(); // 返回并移除最先加入的元素
  • 缺点
    • 同样受限于FIFO特性,不适合非顺序访问需求。

链表 (LinkedList)


- **优点**:- **灵活的内存管理**:节点分散存储,可轻松插入和删除节点,尤其对头尾节点的操作效率高(时间复杂度O(1))。```csharp
LinkedList<int> linkedList = new LinkedList<int>();
linkedList.AddLast(1);
linkedList.AddFirst(0); // 在链表头部添加元素
  • 缺点
    • 随机访问性能差:由于非连续存储,访问中间节点需要从头节点开始遍历,时间复杂度为O(n)。

哈希表 (Dictionary<TKey, TValue>) 或 HashSet

优点

  • 快速查找与插入:基于哈希函数进行数据存储,理想情况下查找、插入和删除的时间复杂度接近O(1)。
Dictionary<string, int> dictionary = new Dictionary<string, int>();
dictionary.Add("apple", 1);
int countOfApples = dictionary["apple"]; // 快速通过键获取值HashSet<int> set = new HashSet<int>();
set.Add(1);
bool containsOne = set.Contains(1); // 检查是否包含某个元素
  • 缺点
    • 冲突处理:可能出现哈希冲突,需采用适当策略(如链地址法或开放寻址法)来解决,这可能影响性能。
    • 无序性:迭代输出的顺序不确定(除非使用SortedDictionary<TKey, TValue>)。

集合 (Collection)

说明:在C#中,集合通常指代泛型集合基类,它定义了通用集合行为。实际应用中更多是指其派生类如List<T>ArrayList等。

选择建议:

  • 当元素数量已知且不变,且需要频繁随机访问时,使用数组。
  • 对于需要动态增删且支持索引访问的情况,首选List。
  • 当算法要求按“后进先出”或“先进先出”的顺序处理元素时,分别使用Stack和Queue。
  • 当需要高效的插入、删除和查找操作,而不在乎元素的顺序时,优先考虑LinkedList。
  • 当需要根据键快速查找对应值或者存储唯一元素时,应使用Dictionary<TKey, TValue>或HashSet。

python学习汇总连接:
50个开发必备的Python经典脚本(1-10)

50个开发必备的Python经典脚本(11-20)

50个开发必备的Python经典脚本(21-30)

50个开发必备的Python经典脚本(31-40)

50个开发必备的Python经典脚本(41-50)
————————————————

​最后我们放松一下眼睛
在这里插入图片描述

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

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

相关文章

OCP NVME SSD规范解读-6.标准日志要求-2

STD-LOG-12:针对日志存储的类型定义了多种&#xff0c;复位&#xff08;包括控制器复位&#xff0c;NSSR、FLR、PCIe hot reset&#xff09;与断电重启POWER CYCLE有不同的操作要求。 STD-LOG-14: Lockdown命令是NVMe管理命令集中的一个命令&#xff0c;主要用于安全和管理目的…

太惨了,又一个程序员被渣的开年大瓜

今天闲暇之余浏览了一下mm&#xff0c;忽然看见一条瓜&#xff1a;某东pdf瓜&#xff0c;一份19页的PDF文件&#xff0c;题为《婚房变赠予&#xff0c;京东渣女出轨连环套设计冤大头程序员》&#xff0c;点进去看了一下&#xff0c;简直炸裂了三观&#xff0c;男同志们一定要保…

007-可调脉冲数触发之FPGA实现(Zynq也可驱动,带启动停止及完成中断输出)

文章目录 前言一、设计思路二、代码及仿真1.资源消耗2.具体代码3.仿真波形 总结 前言 此代码是在做显微镜高速聚焦系统中自己写的步进电机电机驱动源码&#xff0c;为了达到最快的驱动速度&#xff0c;因此选用脉冲触发方式进行驱动。在电机驱动的过程中往往需要对脉冲进行使能…

优雅处理并发:Java CompletableFuture最佳实践

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;今天&#xff0c;小黑要和大家聊聊CompletableFuture&#xff0c;这个Java 8引入的强大工具。 在Java传统的Future模式里&#xff0c;咱们都知道&#xff0c;一旦开始了一个异步操作&#xff0c;就只能等它结束…

x-cmd pkg | magick - 开源图像处理工具

目录 简介首次用户功能特点类似工具与竞品进一步探索 简介 magick 是由 ImageMagick 提供的一个功能强大且多功能的开源图像处理工具&#xff0c;可以灵活高效地处理图像文件&#xff0c;例如格式转换、图像大小调整、图像裁减、图像拼接、图像色彩校正和图像合成等常见的图像…

什么是线程?

线程 1. 线程概述 线程是计算机科学中的基本概念&#xff0c;指的是在一个进程中执行的独立指令流。通常&#xff0c;一个进程可以包含多个线程&#xff0c;它们共享进程的资源&#xff0c;如内存空间、文件句柄等&#xff0c;但每个线程有自己的独立执行流。线程是操作系统进…

档案统一管理的具体做法包括哪些?

档案统一管理工作&#xff0c;需要根据统管单位工作特点重建管理流程&#xff0c;优化和规范管理。档案统一管理的具体做法包括&#xff1a; 1. 设立档案管理部门或档案管理团队&#xff0c;负责统一管理机构的所有档案资料。 2. 建立档案管理制度和流程&#xff0c;明确档案的…

数字战场上的坚固屏障:雷池社区版(WAF)

黑客的挑战 智能语义分析算法&#xff1a; 黑客们常利用复杂技术进行攻击&#xff0c;但雷池社区版的智能语义分析算法能深入解析攻击本质&#xff0c;即使是最复杂的攻击手法也难以逃脱。 0day攻击防御&#xff1a; 传统防火墙难以防御未知攻击&#xff0c;但雷池社区版能有效…

【Linux Shell】5. 运算符

文章目录 【 1. 算术运算符 】1.1 expr 命令1.2 [ ] 方括号 【 2. 关系运算符 】【 3. 布尔运算符 】【 4. 逻辑运算符 】【 5. 字符串运算符 】【 6. 文件测试运算符 】 【 1. 算术运算符 】 运算符说明举例赋值a$b 把变量 b 的值赋给 a。 1.1 expr 命令 原生 bash 不支持简…

vue 自定义网页图标 favicon.ico 和 网页标题

效果预览 1. 添加配置 vue.config.js 在 module.exports { 内添加 // 自定义网页图标pwa: {iconPaths: {favicon32: "./favicon.ico",favicon16: "./favicon.ico",appleTouchIcon: "./favicon.ico",maskIcon: "./favicon.ico",msTil…

详解c++移动构造函数和移动赋值运算符在代码性能中的作用

对象移动 对象移动&#xff0c;就是把一个不想用了的对象A中的一些有用的数据提取出来&#xff0c;在构建新对象B的时候就不需要重新构建对象中的所有数据——从不想用了的对象A中提取出来的有用数据在构建对象B时都可以拿来使用。 我们知道&#xff0c;拷贝构造函数、拷贝赋…

openGauss学习笔记-193 openGauss 数据库运维-常见故障定位案例-备机卡住-数据库只读

文章目录 openGauss学习笔记-193 openGauss 数据库运维-常见故障定位案例-备机卡住-数据库只读193.1 switchover操作时&#xff0c;主机降备卡住193.1.1 问题现象193.1.2 原因分析193.1.3 处理办法 193.2 磁盘空间达到阈值&#xff0c;数据库只读193.2.1 问题现象193.2.2 原因分…