一、常用泛型数据结构类——Dictionary字典

1、Dictionary的本质

Dictionary 是一个基于哈希表实现的集合,它存储的是键值对(key-value pairs)。与传统的 Hashtable 相比,Dictionary 是泛型的,允许用户自定义键和值的类型。它的底层使用哈希算法来根据键(key)快速查找对应的值(value)。可以将Dictionary理解为拥有泛型的Hashtable

  • 键值对类型Hashtableobject 类型变成了可以自己指定的泛型类型。
  • 键(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() 可以避免因添加重复键而导致的异常。
  • 遍历字典时,可以通过 KeysValuesKeyValuePair<TKey, TValue> 来访问字典的内容。

二、Stack<T>泛型栈和Queue<T>泛型队列

  • 非泛型的 StackQueue 存储值类型时会发生装箱,取出时会发生拆箱,这会带来性能开销。
  • 泛型的 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

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

Logo

分享前沿Unity技术干货和开发经验,精彩的Unity活动和社区相关信息

更多推荐