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

本文介绍了C#中数组、List、Stack、Queue、链表以及哈希表等数据结构的特点、优缺点,并给出了在不同场景下的选择建议。同时提及了Python开发中50个经典脚本的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数组 (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)
————————————————

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极致人生-010

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值