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

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

时间:2024-11-11 18:16:32浏览次数:3  
标签:容器 Dictionary C# 30 Alice Add new Staff

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

标签:容器,Dictionary,C#,30,Alice,Add,new,Staff
From: https://blog.csdn.net/weixin_52173250/article/details/143659642

相关文章

  • C++ 核心代码
    C++核心代码通常指一些基础、常用的代码片段,可以用于各种C++项目中,包括输入输出、基本数据结构、算法实现等。下面是一些典型的C++核心代码示例:1.基本输入输出cppinclude<iostream>usingnamespacestd;intmain(){inta,b;cout<<"Entertwonumbe......
  • 4-3-1.C# 数据容器 - Dictionary(Dictionary 的定义、Dictionary 元素的基本操作、Dict
    Dictionary概述Dictionary<TKey,TValue>存储的是键值对(Key-Value),通过键(Key)来存储或修改值(Value)Dictionary<TKey,TValue>存储的键值对是无序的Dictionary<TKey,TValue>存储的键是不可重复的Dictionary<TKey,TValue>支持泛型,可以指定存储的键值对的类型D......
  • 推荐一款快速启动工具:Glary Quick Startup
    GlaryQuickStartup是一款快速启动工具,减缓PC加载速度,顾名思义,它是一个快速简单的启动管理器,专门设计用于通过延迟某些程序在系统启动后自动启动,或删除不必要的程序在系统启动时抢夺资源来启动自己,从而加快Windows启动。快速启动用于安排自动启动程序并为系统启动提供足够的......
  • 理解@Transactional
    在SpringBoot中,@Transactional注解仍然是Spring框架提供的一个核心注解,用于声明式事务管理。SpringBoot通过自动配置和简化配置,使得在SpringBoot应用程序中使用@Transactional注解变得更加方便。本文将深入探讨@Transactional注解在SpringBoot中的使用方法、......
  • Design Space Exploration
    DesignSpaceExplorationSolutionstoprojectassignmentsaretobedevelopedwithinyourgroup,withoutcollaborationwithothergroups.However,astheprojectsinthisclassrequiretheuseofsoftwaretoolsandframeworksthatstudentsmayhaveuneve......
  • csp2024游记
    趁着还有记忆,就来写篇游记吧!\(upd:\)之前游记没发想等分出来,现在终于来喽!--\(2024.11.4\)初赛篇普及组今年的普及好好好好简单啊!基本上都是一眼题,一个小时就写完了。然后出考场一交流,发现我第一题记错\(int\)的范围了,喜提98。提高组今年的提高好好好好困难啊!基本上是......
  • 管理 Python 环境和依赖关系的工具 venv、virtualenv、pipenv 、poetry 、 miniforge
    管理Python环境和依赖关系的工具venv、virtualenv、pipenv、poetry、miniforge和anaconda的区别venv、virtualenv、pipenv、Poetry、Miniforge和Anaconda都是用于管理Python环境和依赖关系的工具,但它们在功能和使用场景上有一些显著的区别。以下是它们的主要区别:v......
  • 2024 CSP-S 游记
    时光荏苒,光阴似箭,新一轮CSP又过去了。(吐槽SD不允许JS同报。)10.25晚在家中打去年S组的T2,并不理解为什吗是蓝题,按理说DP式子挺好推的。10.26早上fqr还吓唬我们没带身份证。早晨在集合地询问fqr最小生成树的重载运算符是什么意思,菜。在车上的闲事:观看蓝书。......
  • TCP最后一次握⼿连接阶段,如果ACK包丢失会怎样?
    2024年10月NJSD技术盛典暨第十届NJSD软件开发者大会、第八届IAS互联网架构大会在南京召开。百度文心快码总经理臧志分享了《AI原生研发新范式的实践与思考》,探讨了大模型赋能下的研发变革及如何在公司和行业中落地,AI原生研发新范式的内涵和推动经验。......
  • 解决 VSCode 中 C/C++ 编码乱码问题的两种方法
    解决VSCode中C/C++编码乱码问题的两种方法在中国地区,Windows系统中的cmd和PowerShell默认编码是GBK,但VSCode默认使用UTF-8编码。这种编码不一致会导致在VSCode终端中运行C/C++程序时出现乱码。以下介绍两种方法来解决这一问题。方法一:通过CodeRunner......