【从零开始入门unity游戏开发之——C#篇32】C#其他不常用的泛型数据结构类、顺序存储和链式存储

文章目录

一、其他不常用的泛型数据结构类(了解即可,不常用)

1、LinkedList双向链表

LinkedList<T> 是一种双向链表,支持高效的插入和删除操作,但随机访问元素的性能较差。

  • 常用方法:
    • AddFirst(T item):将元素添加到链表的开头。
    • AddLast(T item):将元素添加到链表的末尾。
    • Remove(T item):删除链表中的指定元素。
    • Find(T item):查找指定元素在链表中的位置。
csharp 复制代码
LinkedList<string> linkedList = new LinkedList<string>();
linkedList.AddLast("First");
linkedList.AddFirst("Zero");
linkedList.AddLast("Second");

foreach (var item in linkedList)
{
    Console.WriteLine(item);
}
// 输出:
// Zero
// First
// Second

2、HashSet

HashSet<T> 是一个不允许重复元素的集合,它提供快速查找、插入和删除操作。它不保证元素的顺序,因此如果需要按照特定顺序存储元素,可以使用 SortedSet<T>

  • 常用方法
    • Add(T item):向集合添加元素,如果元素已存在,则不添加。
    • Remove(T item):从集合中删除指定的元素。
    • Contains(T item):检查集合中是否包含指定的元素。
    • Count:获取集合中元素的数量。
csharp 复制代码
HashSet<int> set = new HashSet<int> { 1, 2, 3, 4 };
set.Add(5);
set.Add(2);  // 不会添加,因为 2 已经存在
Console.WriteLine(set.Count); // 输出 5

3、SortedList<TKey, TValue>

SortedList<TKey, TValue> 是一个键值对集合,键是排序的,提供按键的升序访问。其底层实现类似于一个有序的字典。

  • 常用方法
    • Add(TKey key, TValue value):添加键值对。
    • Remove(TKey key):删除指定键的键值对。
    • ContainsKey(TKey key):检查字典中是否包含指定的键。
    • KeysValues:获取按排序顺序排列的所有键和值。
csharp 复制代码
SortedList<int, string> sortedList = new SortedList<int, string>();
sortedList.Add(3, "Three");
sortedList.Add(1, "One");
sortedList.Add(2, "Two");

foreach (var kvp in sortedList)
{
    Console.WriteLine($"{kvp.Key}: {kvp.Value}");
}
// 输出:
// 1: One
// 2: Two
// 3: Three

4、SortedSet

SortedSet<T> 是一个不允许重复元素的集合,但与 HashSet<T> 不同,SortedSet<T> 保证元素是排序的(默认升序)。适用于需要自动排序的场景。

  • 常用方法
    • Add(T item):添加元素,如果元素已存在则不添加。
    • Remove(T item):删除指定元素。
    • Contains(T item):检查集合中是否包含指定的元素。
    • Count:获取集合中元素的数量。
csharp 复制代码
SortedSet<int> sortedSet = new SortedSet<int> { 3, 1, 4, 2 };
sortedSet.Add(5);  // 添加 5
Console.WriteLine(string.Join(", ", sortedSet));  // 输出 1, 2, 3, 4, 5

5、总结

这些泛型数据结构类为 C# 提供了丰富的集合操作,能够满足大多数常见的数据存储和操作需求。每种数据结构都有其独特的特点和使用场景,可以根据具体需求选择合适的数据结构。


二、顺序存储和链式存储

  • 顺序存储适用于查找和修改操作较频繁的情况。
  • 链式存储适用于插入和删除操作较频繁的场景,尤其是在频繁插入或删除的情况下,链表表现更好。

1、顺序存储(Array-based Storage)

顺序存储是指数据元素在内存中是连续存放的,这样可以通过索引直接访问数据,因此顺序存储对于查找和修改操作非常高效。C# 中顺序存储的主要数据结构有:

1.1. 数组(Array)

  • 数组是最典型的顺序存储结构,元素在内存中是连续的。
  • 优点:查找和修改操作非常高效。
  • 缺点:插入和删除操作效率较低,尤其是在数组中间插入或删除时需要移动大量元素。
csharp 复制代码
int[] arr = {1, 2, 3, 4, 5};  // 顺序存储

1.2. List

  • List<T> 是基于数组实现的泛型集合类,存储的数据是顺序存储的。
  • 优点:通过动态数组实现,当元素超出当前数组容量时,会进行扩容。
  • 缺点:插入和删除操作(尤其是在列表的中间位置)可能需要移动元素,时间复杂度为 O(n)。
csharp 复制代码
List<int> list = new List<int> { 1, 2, 3, 4, 5 };  // 顺序存储

1.3. String

  • 字符串在 C# 中是不可变的,实际上它内部是一个字符数组(char[]),因此也可以看作是顺序存储。
  • 优点:支持高效的字符查找和修改。
  • 缺点:字符串是不可变的,所以修改时需要生成新字符串,可能会涉及内存重新分配。
csharp 复制代码
string str = "Hello";  // 顺序存储

1.4. Dictionary<TKey, TValue>(顺序存储和哈希表结合):

  • Dictionary<TKey, TValue> 是基于哈希表实现的,但它在底层维护一个数组来存储元素。
  • 优点:查找、插入、删除操作非常高效。
  • 缺点:哈希冲突可能影响性能,尤其是在哈希函数不够理想时。
csharp 复制代码
Dictionary<int, string> dict = new Dictionary<int, string>();
dict.Add(1, "one");
dict.Add(2, "two");  // 顺序存储和哈希表结合

2、链式存储(Linked Storage)

链式存储是指数据元素在内存中不需要连续存放,而是通过指针(或引用)将元素连接起来。这使得在插入和删除时更为高效,但在查找时需要遍历链表,因此查找操作的时间复杂度较高。C# 中链式存储的常见数据结构有:

2.1. LinkedList

  • LinkedList<T> 是 C# 中的双向链表实现,每个元素(节点)都包含指向前一个节点和下一个节点的引用。
  • 优点:插入和删除操作效率高,特别是在链表的头部或中间插入/删除时。
  • 缺点:查找元素时需要遍历链表。
csharp 复制代码
LinkedList<int> linkedList = new LinkedList<int>();
linkedList.AddLast(1);  // 链式存储
linkedList.AddLast(2);

2.2. Queue(基于链式存储)

  • Queue<T> 是一种先进先出(FIFO)的队列数据结构,C# 中的 Queue<T> 使用链表(或环形缓冲区)实现。
  • 优点:对于入队和出队操作效率高。
  • 缺点:在队列中间插入或删除操作的复杂度较高,因为它是一个 FIFO 结构。
csharp 复制代码
Queue<int> queue = new Queue<int>();
queue.Enqueue(1);  // 链式存储
queue.Enqueue(2);

2.3. Stack(基于链式存储)

  • Stack<T> 是一种后进先出(LIFO)的栈数据结构,C# 中的 Stack<T> 实际上是基于链表实现的。
  • 优点:对于推入和弹出操作效率高。
  • 缺点:和队列一样,栈是基于链式存储的,因此访问栈中间的元素比较慢。
csharp 复制代码
Stack<int> stack = new Stack<int>();
stack.Push(1);  // 链式存储
stack.Push(2);

专栏推荐

地址
【从零开始入门unity游戏开发之------C#篇】
【从零开始入门unity游戏开发之------unity篇】
【制作100个Unity游戏】
【推荐100个unity插件】
【实现100个unity特效】
【unity框架开发】

完结

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

好了,我是向宇https://xiangyu.blog.csdn.net

一位在小公司默默奋斗的开发者,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!如果你遇到任何问题,也欢迎你评论私信或者加群找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~

相关推荐
冯汉栩2 分钟前
Swift Control View,Label渐变颜色(源码)
开发语言·ios·swift
程序员黑豆23 分钟前
Java中的null与NullPointerException完全指南:安全处理、实战排查与面试题
java·前端·ai编程
晴天161 小时前
Electron面试题-Day19
java·javascript·electron
白狐_7981 小时前
408 数据结构|线索二叉树两题详解:先序线索化后的空链域 + 中序前驱/后继判断
c语言·数据结构·链表
从小就看凹凸曼^o^1 小时前
Python基础5 - 字典与集合:(1)字典
开发语言·python
GeekZHR1 小时前
C语言指针进阶补充6:动态内存管理、mem系列内存函数、复杂指针声明,一次补齐指针的“三大盲区“
java·c语言·算法·指针
侧耳倾听1111 小时前
java 日志框架简介
java·开发语言
zlinear数据采集卡2 小时前
数据采集卡从入门到精通(9):分辨率与精度——16位卡不等于1/65536的精度
开发语言·数据库·fpga开发·开源·c#
她的男孩2 小时前
我用 LLM 把后台 CRUD 效率提升 10 倍:AI 代码生成器的架构与落地实践
java·后端·架构
全栈技术负责人2 小时前
解密 MCP(Model Context Protocol):大模型时代的“Type-C”总线与三驾马车架构深度解析
开发语言·ai·架构