
【从零开始入门unity游戏开发之——C#篇31】C#常用泛型数据结构类——`Dictionary`字典、`Stack<T>`泛型栈和`Queue<T>`泛型队列
C#常用泛型数据结构类——`Dictionary`字典、`Stack<T>`泛型栈和`Queue<T>`泛型队列
文章目录
一、常用泛型数据结构类——Dictionary
字典
1、Dictionary
的本质
Dictionary
是一个基于哈希表实现的集合,它存储的是键值对(key-value pairs)。与传统的 Hashtable
相比,Dictionary
是泛型的,允许用户自定义键和值的类型。它的底层使用哈希算法来根据键(key)快速查找对应的值(value)。可以将Dictionary理解为拥有泛型的Hashtable
。
- 键值对类型 从
Hashtable
的object
类型变成了可以自己指定的泛型类型。 - 键(key) 必须是唯一的。
- 值(value) 可以重复。
2、增、删、查、改 操作
2.1. 增: Add()
方法
Dictionary
不允许插入重复的键。如果插入重复的键,将会抛出异常。- 注意:
Add()
方法如果添加的键已经存在会抛出异常,可以使用TryAdd()
来避免异常。
示例:
Dictionary<int, string> dictionary = new Dictionary<int, string>();
// 添加键值对
dictionary.Add(1, "123");
dictionary.Add(2, "222");
// 这里尝试添加重复键,会抛出异常
// dictionary.Add(1, "333"); // 会抛出 ArgumentException
TryAdd()
(C# 7.0+)方法可以安全地添加键值对,如果键已经存在,它不会抛出异常。
// 尝试添加键值对
dictionary.TryAdd(3, "333"); // 如果键3不存在,会添加,若已存在,不会抛出异常
2.2. 删: Remove()
方法 & Clear()
Remove()
方法删除指定键的元素。如果该键不存在,则什么也不做。Clear()
方法会删除所有键值对。
示例:
// 删除键为1的元素
dictionary.Remove(1);
// 删除不存在的键4,什么也不做
dictionary.Remove(4);
// 清空字典
dictionary.Clear();
2.3. 查: 根据键查找值
- 通过键查找值时,如果键不存在,会抛出异常。
ContainsKey()
用于检查字典中是否包含某个键。ContainsValue()
用于检查字典中是否包含某个值。
示例:
// 根据键查找值
Console.WriteLine(dictionary[2]); // 如果键2存在,会输出值,若键不存在会抛出 KeyNotFoundException
// 使用 ContainsKey 判断键是否存在
if (dictionary.ContainsKey(2))
{
Console.WriteLine("存在键2的键值对");
}
// 使用 ContainsValue 判断值是否存在
if (dictionary.ContainsValue("222"))
{
Console.WriteLine("存在值222的键值对");
}
2.4. 改: 通过键修改值
- 可以直接通过键修改值。如果键不存在,会抛出异常。
示例:
// 修改键为1的值
dictionary[1] = "555";
// 输出修改后的值
Console.WriteLine(dictionary[1]); // 输出: 555
3、遍历
3.1. 遍历所有键
可以通过 Keys
属性获取字典中的所有键,并通过这些键来访问对应的值。
示例:
Console.WriteLine("**************");
// 遍历所有键
foreach (int key in dictionary.Keys)
{
Console.WriteLine($"键: {key} 值: {dictionary[key]}");
}
3.2. 遍历所有值
可以通过 Values
属性获取字典中的所有值。
示例:
Console.WriteLine("**************");
// 遍历所有值
foreach (string value in dictionary.Values)
{
Console.WriteLine($"值: {value}");
}
3.3. 遍历键值对
可以同时遍历字典中的键和值,使用 KeyValuePair<TKey, TValue>
来访问每个键值对。
示例:
Console.WriteLine("**************");
// 遍历所有键值对
foreach (KeyValuePair<int, string> item in dictionary)
{
Console.WriteLine($"键: {item.Key}, 值: {item.Value}");
}
4、总结
Dictionary<TKey, TValue>
是一种基于哈希表实现的泛型集合,可以存储键值对,提供快速的查找、添加、删除和修改操作。- 常用方法:
Add()
、Remove()
、ContainsKey()
、ContainsValue()
、Clear()
。 - 字典的键是唯一的,值可以重复。使用
TryAdd()
可以避免因添加重复键而导致的异常。 - 遍历字典时,可以通过
Keys
、Values
或KeyValuePair<TKey, TValue>
来访问字典的内容。
二、Stack<T>
泛型栈和Queue<T>
泛型队列
- 非泛型的
Stack
和Queue
存储值类型时会发生装箱,取出时会发生拆箱,这会带来性能开销。 - 泛型的
Stack<T>
和Queue<T>
避免了装箱和拆箱操作,因为它们直接存储和取出指定类型的元素。
因此,推荐始终使用泛型版本的 Stack<T>
和 Queue<T>
,特别是在处理值类型时,可以提高性能并避免不必要的装箱和拆箱。
泛型版本的 Stack<T>
和 Queue<T>
的使用和前面Stack和Queue一样。
1、Stack泛型栈
Stack<T>
是一种后进先出(LIFO,Last In First Out)的数据结构,常用于保存临时数据或函数调用的执行顺序。
- 常用方法:
Push(T item)
:将元素压入栈。Pop()
:从栈顶移除并返回元素。Peek()
:查看栈顶的元素,但不移除它。Count
:获取栈中元素的数量。
Stack<int> stack = new Stack<int>();
stack.Push(1);
stack.Push(2);
Console.WriteLine(stack.Pop()); // 输出 2
2、Queue泛型队列
Queue<T>
是一种先进先出(FIFO,First In First Out)的数据结构,适用于处理排队或等待处理的任务。
- 常用方法:
Enqueue(T item)
:向队列尾部添加元素。Dequeue()
:从队列头部移除并返回元素。Peek()
:查看队列头部的元素,但不移除它。Count
:获取队列中元素的数量。
Queue<string> queue = new Queue<string>();
queue.Enqueue("Task 1");
queue.Enqueue("Task 2");
Console.WriteLine(queue.Dequeue()); // 输出 Task 1
专栏推荐
地址 |
---|
【从零开始入门unity游戏开发之——C#篇】 |
【从零开始入门unity游戏开发之——unity篇】 |
【制作100个Unity游戏】 |
【推荐100个unity插件】 |
【实现100个unity特效】 |
【unity框架开发】 |
完结
赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注
,你的每一次支持
都是我不断创作的最大动力。当然如果你发现了文章中存在错误
或者有更好的解决方法
,也欢迎评论私信告诉我哦!
好了,我是向宇
,https://xiangyu.blog.csdn.net
一位在小公司默默奋斗的开发者,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!如果你遇到任何问题,也欢迎你评论私信或者加群找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~
更多推荐
所有评论(0)