【C# 基础精讲】字典(Dictionary)的使用

news2025/2/26 9:29:37

在这里插入图片描述

在C#中,Dictionary<TKey, TValue>是一种非常常用的泛型集合类,用于存储键值对(Key-Value Pair)的数据结构。Dictionary<TKey, TValue>可以根据键快速查找对应的值,因此在需要快速查找和检索数据的场景下,特别是在涉及大量数据时,使用字典是非常高效的选择。本文将详细介绍Dictionary<TKey, TValue>的应用,包括创建字典、添加元素、访问元素、删除元素、遍历字典、常用的方法等内容。

1. 创建字典

要使用Dictionary<TKey, TValue>,同样需要引入System.Collections.Generic命名空间。在创建字典时,需要指定键和值的类型,例如,如果我们希望以字符串作为键,以整数作为值,则创建一个Dictionary<string, int>类型的字典。

using System.Collections.Generic;

// 创建一个以字符串作为键,以整数作为值的字典
Dictionary<string, int> ageDict = new Dictionary<string, int>();

在上述代码中,我们创建了一个Dictionary<string, int>类型的字典ageDict,用于存储人名和年龄的对应关系。

2. 添加元素

可以使用Add()方法向字典中添加键值对。如果键已经存在于字典中,则Add()方法将会抛出异常。如果我们希望键可以重复,则可以使用索引符号[]直接给字典赋值,这样如果键已经存在,则会更新对应的值。

// 添加键值对到字典中
ageDict.Add("Alice", 25);
ageDict.Add("Bob", 30);
ageDict.Add("Charlie", 22);

// 直接赋值给字典,如果键已存在,则更新对应的值
ageDict["Alice"] = 26;

在上述代码中,我们向ageDict字典中添加了三个键值对,然后通过ageDict["Alice"] = 26将键"Alice"对应的值从25更新为26。

3. 访问元素

可以通过键访问字典中的值。使用索引符号[]和键来获取对应的值。如果字典中不存在该键,则会抛出异常。为了避免抛出异常,可以使用TryGetValue()方法。

// 通过键访问字典中的值
int aliceAge = ageDict["Alice"]; // 获取"Alice"对应的值,此处为26

// 使用 TryGetValue() 避免抛出异常
if (ageDict.TryGetValue("Bob", out int bobAge))
{
    Console.WriteLine($"Bob's age: {bobAge}"); // 输出"Bob's age: 30"
}
else
{
    Console.WriteLine("Bob's age not found.");
}

在上述代码中,我们通过ageDict["Alice"]获取键"Alice"对应的值,并使用TryGetValue()方法获取键"Bob"对应的值。如果键"Bob"存在,则将对应的值赋给变量bobAge,否则输出"Bob’s age not found."。

4. 删除元素

可以使用Remove()方法根据键从字典中删除元素。

// 删除字典中的键值对
ageDict.Remove("Charlie");

在上述代码中,我们使用Remove()方法从ageDict字典中删除了键"Charlie"对应的键值对。

5. 遍历字典

可以使用foreach循环遍历字典中的所有键值对,或者分别遍历键和值。

// 遍历键值对
foreach (var kvp in ageDict)
{
    Console.WriteLine($"{kvp.Key}: {kvp.Value}");
}

// 遍历键
foreach (var key in ageDict.Keys)
{
    Console.WriteLine(key);
}

// 遍历值
foreach (var value in ageDict.Values)
{
    Console.WriteLine(value);
}

在上述代码中,我们使用foreach循环遍历了ageDict字典中的所有键值对、所有键和所有值。

6. Dictionary<TKey, TValue>常用方法

除了上述介绍的基本操作外,Dictionary<TKey, TValue>还提供了许多其他常用的方法,方便对字典进行操作。下面列举一些常用的方法:

Count

Count属性用于获取字典中键值对的数量。

int count = ageDict.Count; // 获取键值对的数量,此处为2

在上述代码中,count将会被赋值为2,表示ageDict字典中有两个键和值的键值对。

ContainsKeyContainsValue

ContainsKey()方法用于判断字典中是否包含指定的键,返回一个布尔值。ContainsValue()方法用于判断字典中是否包含指定的值,返回一个布尔值。

bool hasAlice = ageDict.ContainsKey("Alice"); // 判断字典是否包含键"Alice"
bool hasAge30 = ageDict.ContainsValue(30); // 判断字典是否包含值为30的元素

在上述代码中,hasAlice将会被赋值为true,因为ageDict字典中包含键"Alice"。而hasAge30将会被赋值为false,因为ageDict字典中的值为2622,没有值为30的元素。

Clear

Clear()方法用于清空整个字典,即删除所有键值对。

ageDict.Clear(); // 清空字典

在上述代码中,Clear()会将ageDict字典中的所有键值对全部删除,字典变为空。

7. 字典的应用场景

字典是一种非常实用的数据结构,适用于许多场景。以下是一些常见的应用场景:

数据索引

字典常用于数据索引,通过唯一的键来快速查找对应的值。例如,可以使用字典将学生的学号作为键,学生的姓名作为值,实现通过学号快速查找学生姓名。

Dictionary<string, string> studentNameDict = new Dictionary<string, string>();
studentNameDict.Add("2021001", "Alice");
studentNameDict.Add("2021002", "Bob");
studentNameDict.Add("2021003", "Charlie");

string name = studentNameDict["2021002"]; // 获取学号为"2021002"的学生姓名,此处为"Bob"

统计频次

字典可以用于统计一组数据中各元素出现的频次。键可以是数据元素,值可以是频次。

List<string> fruitsList = new List<string> { "apple", "orange", "banana", "apple", "orange", "apple" };
Dictionary<string, int> fruitCountDict = new Dictionary<string, int>();

foreach (var fruit in fruitsList)
{
    if (fruitCountDict.ContainsKey(fruit))
    {
        fruitCountDict[fruit]++;
    }
    else
    {
        fruitCountDict.Add(fruit, 1);
    }
}

foreach (var kvp in fruitCountDict)
{
    Console.WriteLine($"{kvp.Key}: {kvp.Value}");
}

在上述代码中,我们使用字典fruitCountDict统计了水果列表fruitsList中各个水果出现的频次,并输出了统计结果。

缓存数据

字典可以用于缓存数据,以提高数据访问的效率。在某些场景下,一些数据可能需要频繁读取,为了避免重复计算或从数据库中读取数据,可以将这些数据缓存到字典中。

Dictionary<string, int> fibCache = new Dictionary<string, int>();

int Fibonacci(int n)
{
    if (n <= 1)
    {
        return n;
    }

    if (fibCache.ContainsKey(n.ToString()))
    {
        return fibCache[n.ToString()];
    }

    int result = Fibonacci(n - 1) + Fibonacci(n - 2);
    fibCache.Add(n.ToString(), result);
    return result;
}

在上述代码中,我们实现了一个斐波那契数列的函数Fibonacci(),为了避免重复计算,我们将已经计算过的结果缓存到fibCache字典中。

8. 总结

Dictionary<TKey, TValue>是C#中非常常用的泛型集合类,用于存储键值对的数据结构。本文介绍了Dictionary<TKey, TValue>的应用,包括创建字典、添加元素、访问元素、删除元素、遍历字典以及常用的方法。字典是一种高效的数据结构,在需要快速查找和检索数据的场景下特别有用。希望通过本文的介绍,您可以更好地了解和使用Dictionary<TKey, TValue>,从而在C#编程中更加灵活和高效地处理键值对数据。祝您在C#编程中取得更大的成功!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/862643.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Lorenz系统最大lyapunov exponent的求解

首先看下Lorenz混沌系统: 赋予初始值,例如: 当然,初始值可以根据需要设定。 看下他的吸引子,很美: 看下他的分叉图:

【uniapp】使用Vs Code开发uniapp:

文章目录 一、使用命令行创建uniapp项目&#xff1a;二、安装插件与配置&#xff1a;三、编译和运行:四、修改pinia&#xff1a; 一、使用命令行创建uniapp项目&#xff1a; 二、安装插件与配置&#xff1a; 三、编译和运行: 该项目下的dist》dev》mp-weixin文件导入微信开发者…

SLAM框架与相关理论梳理

应该是思维导图的形式使用markmap实现,可以使用md文档在VSCode中添加插件预览,预览图如绑定的那个资源的样式。 效果大概是长这个样子 > 但是CSDN不好用,一堆乱码。这里建议从这个链接中复制下载md文件,使用VSCode的markmap插件查看,或者直接把md的内容复制到markmap网…

Java SPI机制详解-01

1. 概述 SPI&#xff08;Service Provider Interface&#xff09;&#xff0c;是 Java 6 引入了一个内置功能&#xff0c;实现服务提供发现和加载机制&#xff0c;使之与特定接口的匹配。 SPI 机制的核心思想就是 解耦 &#xff0c;将装配的控制权移到程序之外&#xff0c;这…

多模态图像融合的相关驱动双分支特征分解

文章目录 CDDFuse: Correlation-Driven Dual-Branch Feature Decomposition for Multi-Modality Image Fusion摘要本文方法损失函数 实验结果 CDDFuse: Correlation-Driven Dual-Branch Feature Decomposition for Multi-Modality Image Fusion 摘要 多模态图像融合的目的是使…

GaussDB之SQL Audit,面向应用开发的SQL审核工具

前言 我们先从一个SQL语句说起&#xff08;以某传统单机数据库为例&#xff09;。 也许这就是我们业务代码中潜藏的一个SQL语句&#xff0c;对于一个普通开发者来说&#xff0c;这个语句编写工整&#xff0c;逻辑清晰&#xff0c;没有什么问题&#xff0c;可以直接推到代码仓中…

只需要一个技巧,医疗设备立马大变样!

当谈及医疗领域中的设备运行与维护&#xff0c;蓄电池的监控成为至关重要的一环。医疗设备的顺利运行直接关系到患者的生命安全和医疗工作的有效性。为此&#xff0c;对医疗设备所使用的蓄电池进行实时监控和管理显得尤为关键。 蓄电池监控不仅提高了医疗设备的可靠性&#xff…

7个位运算符(二进制运算)(左移右移运算符的使用)

位运算符运算符运算范例<<左移>>右移>>>无符号右移& 与运算 &#xff08;按位与&#xff09; & | 或运算 &#xff08;按位或&#xff09; ^ 异或运算 &#xff08;按位异或&#xff09; ~ 取反运算 &#xff08;按位取反&…

Apache-Maven

安装Maven 解压apache-maven到目录下 Maven目录如下 bin&#xff1a;目录中存放的是可执行文件&#xff0c;JAVA项目中的编译执行打包都要使用bin. conf:存放的是Maven的配置文件&#xff0c;本地配置、私服配置都需要在conf下的settings.xml进行配置。 lib下存放的是Maven所…

高精度、抗干扰强、低功耗:双频四模卫星定位导航GPS/北斗模块SKG123LD参考设计

北斗定位很好理解&#xff0c;就是通过测量出已知位置的卫星导北斗模块之间的距离&#xff0c;再综合多可卫星的数据计算出北斗模块所在位置的经纬度信息。北斗模块和GPS模块一样&#xff0c;北斗模块被称为用户部分&#xff0c;它像“收音机”捕获并跟踪卫星的信号&#xff0c…

TreeSize优化Windows磁盘空间

TreeSize优化Windows磁盘空间 C盘空间爆红下载连接 C盘空间爆红 最近电脑C盘空间爆红&#xff0c;软件卡顿&#xff0c;从网上下载各种厂商软件辅助清理C盘&#xff0c;效果都不理想&#xff0c;要么提示能给你优化几十G的空间&#xff0c;但是一点击执行&#xff0c;哐哐&…

Xcode 基座打包

Xcode基座打包-APP更新版本内容无效 问题&#xff1a;解决&#xff1a; 问题&#xff1a; 使用xcode基座打包之后&#xff0c;上传到appstore进行提审发布。 用户在appstore商城进行更新下载&#xff0c;打开更新后的APP发现版本号是最新的&#xff0c;APP里面的其他内容还是上…

实现简单通信 JAVA

创建服务端与客户端&#xff0c;再利用Java中socket编程传入传出数据 服务端 import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; public class QqMain extends JFrame implements ActionListener{public static void …

CentOS7 安装远程桌面

换源 设置镜像源为清华源&#xff1a; sudo sed -e s|^mirrorlist|#mirrorlist|g \-e s|^#baseurlhttp://mirror.centos.org/centos|baseurlhttps://mirrors.tuna.tsinghua.edu.cn/centos|g \-i.bak \/etc/yum.repos.d/CentOS-*.repo详见 https://mirrors.tuna.tsinghua.edu.…

【无标题】echarts pieChart legend 图例文字颜色与图例一致

先看成图效果 首先是封装一个公用的函数 const renderPieEcharts (ele: HTMLDivElement,data: Record<string, any>[],color: string[],titleText: string, ) > {const legendData data.map((item, i) > ({name: item.name,textStyle: {color: color[i],},}))co…

【python】python将json字符串导出excel | pandas处理json字符串保存为csv

如何将json转为csv 1、通过json直接转为csv 在Python中&#xff0c;你可以使用pandas库来处理DataFrame&#xff08;数据帧&#xff09;和将JSON数据转换为CSV格式。下面是一个简单的示例代码&#xff0c;展示了如何使用pandas库将JSON数据转换为CSV文件&#xff1a; import p…

前段汇总之JS实现数据双向绑定

参考vue的关键字&#xff1a;v-model绑定值&#xff0c;{{}}&#xff0c;显示值 目录 简单实现双向绑定 使用Proxy优化双向绑定 动态更新值 简单实现双向绑定 新建html5模板&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta char…

Linux 文件编辑命令

一、三种模式介绍 命令模式 插入模式(编辑模式) 末行模式 二、模式切换 1.命令模式切换到插入模式 &#xff08;1&#xff09; a //进入到当前光标后开始编辑 &#xff08;2&#xff09; A //进入到当前光标所在行的行末开始编辑 &#xff08;3&#xff09;i //进入当前光…

P450进阶款无人机室内定位功能研测

在以往的Prometheus 450&#xff08;P450&#xff09;无人机上&#xff0c;我们搭载的是Intel Realsense T265定位模块&#xff0c;使用USB连接方式挂载到机载计算机allspark上&#xff0c;通过机载上SDK驱动T265运行并输出SLAM信息&#xff0c;以此来实现室内定位功能。 为进…

Grafana+Prometheus技术文档-进阶使用-监控spring-boot项目

阿丹&#xff1a; 之前已经实现了使用Prometheus来对服务器进行了监控和仪表盘的创建&#xff0c;现在就需要对这些监控方法使用在spring-boot中去。 实现思路&#xff1a; 1、集成Actuator 2、加入Prometheus的依赖 3、配置开放端口、以及开放监控 4、配置Prometheus中的配置…