当前位置: 首页 > news >正文

4-3-2.C# 数据容器 - Dictionary 扩展(Dictionary 存储对象的特性、Dictionary 与数组的转换)

Dictionary 概述

  1. Dictionary<TKey, TValue> 存储的是键值对(Key - Value),通过键(Key)来存储或修改值(Value)

  2. Dictionary<TKey, TValue> 存储的键值对是无序的

  3. Dictionary<TKey, TValue> 存储的键是不可重复的

  4. Dictionary<TKey, TValue> 支持泛型,可以指定存储的键值对的类型

  5. Dictionary<TKey, TValue> 不是线程安全的,在多线程环境中需要谨慎使用


一、Dictionary 存储对象的特性

  1. Dictionary 存储对象或对对象进行检测时(对象作为键或值时),对于没有重写 Equals 和 GetHashCode 方法的对象可能不太方便
internal class Person
{public String name;public int age;public Person() { }public Person(string name, int age){this.name = name;this.age = age;}
}
Dictionary<Person, string> messageDict = new Dictionary<Person, string>();messageDict.Add(new Person("Alice", 30), "Hello World 1");
messageDict.Add(new Person("Bob", 25), "Hello World 2");Console.WriteLine(messageDict.ContainsKey(new Person("Alice", 30)));
Console.WriteLine(messageDict.ContainsKey(new Person("Alice", 31)));
# 输出结果False
False
Dictionary<string, Person> personDict = new Dictionary<string, Person>();personDict.Add("Alice", new Person("Alice", 30));
personDict.Add("Bob", new Person("Bob", 25));Console.WriteLine(personDict.ContainsValue(new Person("Alice", 30)));
Console.WriteLine(personDict.ContainsValue(new Person("Alice", 31)));
# 输出结果False
False
  1. Dictionary 存储对象或对对象进行检测时(对象作为键或值时),对于重写 Equals 和 GetHashCode 方法的对象比较方便
internal class Staff
{public String name;public int age;public Staff() { }public Staff(string name, int age){this.name = name;this.age = age;}// 重写 Equals 方法public override bool Equals(object obj){// 检查是否为同一个对象的引用if (obj == this) return true;// 检查对象是否为空if (obj == null) return false;// 检查类型是否相同if (obj.GetType() != this.GetType()) return false;// 将 obj 转换为 Staff 类型并进行属性比较Staff staff = obj as Staff;bool agesAreEqual = age == staff.age;bool namesAreEqual = name == null ? null == staff.name : name.Equals(staff.name);return agesAreEqual && namesAreEqual;}public override int GetHashCode(){// 使用属性生成哈希码int hash = 17;hash = hash * 23 + name?.GetHashCode() ?? 0;hash = hash * 23 + age.GetHashCode();return hash;}
}
Dictionary<Staff, string> messageDict = new Dictionary<Staff, string>();messageDict.Add(new Staff("Alice", 30), "Hello World 1");
messageDict.Add(new Staff("Bob", 25), "Hello World 2");Console.WriteLine(messageDict.ContainsKey(new Staff("Alice", 30)));
Console.WriteLine(messageDict.ContainsKey(new Staff("Alice", 31)));
# 输出结果True
False
Dictionary<string, Staff> staffDict = new Dictionary<string, Staff>();staffDict.Add("Alice", new Staff("Alice", 30));
staffDict.Add("Bob", new Staff("Bob", 25));Console.WriteLine(staffDict.ContainsValue(new Staff("Alice", 30)));
Console.WriteLine(staffDict.ContainsValue(new Staff("Alice", 31)));
# 输出结果True
False

二、Dictionary 与数组的转换

1、Dictionary 转数组
  1. Dictionary 转键值对数组
Dictionary<string, int> dict = new Dictionary<string, int>();dict.Add("Alice", 30);
dict.Add("Bob", 25);KeyValuePair<string, int>[] array = dict.ToArray();foreach (KeyValuePair<string, int> kvp in array)
{Console.WriteLine($"{kvp.Key} - {kvp.Value}");
}
# 输出结果Alice - 30
Bob - 25
  1. Dictionary 转键数组
Dictionary<string, int> dict = new Dictionary<string, int>();dict.Add("Alice", 30);
dict.Add("Bob", 25);KeyValuePair<string, int>[] array = dict.ToArray();foreach (KeyValuePair<string, int> kvp in array)
{Console.WriteLine($"{kvp.Key} - {kvp.Value}");
}
# 输出结果Alice
Bob
  1. Dictionary 转值数组
Dictionary<string, int> dict = new Dictionary<string, int>();dict.Add("Alice", 30);
dict.Add("Bob", 25);string[] array = dict.Keys.ToArray();foreach (string item in array)
{Console.WriteLine(item);
}
# 输出结果30
25
2、数组转 Dictionary
var array = new (string, int)[]
{("Alice", 30),("Bob", 25)
};Dictionary<string, int> dict = array.ToDictionary(kvp => kvp.Item1, kvp => kvp.Item2);foreach (KeyValuePair<string, int> kvp in dict)
{Console.WriteLine($"{kvp.Key} - {kvp.Value}");
}
# 输出结果Alice - 30
Bob - 25

http://www.mrgr.cn/news/69750.html

相关文章:

  • 计算机代码python代做matlab编程c语言编写接单matlabqt开发java
  • 设计模式之责任链模式(Chain Of Responsibility)
  • C语言与OpenGL实现3D旋转爱心模型及动画效果
  • 【Python】开心消消乐”简化版源码解析:用Python实现消除游戏基础逻辑
  • 【Webpack配置全解析】打造你的专属构建流程️(4)
  • 微服务容器化部署实践(FontConfiguration.getVersion)
  • 布什各门,C站怎么没通知我就把文章改为VIP文章了?
  • Sigrity SPEED2000 Power Ground Noise Simulation模式如何进行信号时域仿真操作指导(一)-单个信号
  • 超详细!ComfyUI 全方位入门指南,初学者必看,附多个实践操作
  • 仿RabitMQ 模拟实现消息队列项目开发文档1(个人项目)
  • javascript里面的blob和worker
  • Vue2+3 —— 下
  • 《浔川五子棋 v5.0 将于 2025 年上线》
  • Unet++改进20:添加RFAConv||用于特征冗余的空间和通道重构卷积
  • PyQt5
  • 数据结构之带头双向循环链表
  • Web前端效果展示:腺体超声图像分割
  • 2024年下半年软件设计师上午真题【回忆】
  • 常用的c++新特性-->day03
  • ORB-SLAM2源码学习:ORBextractor.cc:ORBextractor特征提取器③
  • pg_dump -Fc 导出的自定义格式数据库文件 相关操作
  • Unity性能优化-具体操作
  • [docker] container 通信 -- bridge
  • Java 8 特性
  • ROS1 Nodelets 与 ROS2 rclcpp_components 多节点运行以及功能插件
  • 手把手教你写Unity3D飞机大战(6)玩家子弹射击之瞄准程序(射线检测)