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

C#中的字典怎么使用?

在C#中,Dictionary<TKey, TValue> 是一个泛型集合类,用于存储键值对(key-value pairs)。它提供了快速的查找、插入和删除操作,适合需要根据键快速查找值的场景。以下是 Dictionary 的基本用法和常见操作:

1. 创建字典

使用 Dictionary<TKey, TValue> 类创建字典,其中 TKey 是键的类型,TValue 是值的类型。

// 创建一个键为 string,值为 int 的字典
Dictionary<string, int> ages = new Dictionary<string, int>();

2. 添加键值对

使用 Add 方法或索引器向字典中添加键值对。

// 使用 Add 方法添加
ages.Add("Alice", 30);
ages.Add("Bob", 25);// 使用索引器添加(如果键已存在,会覆盖值)
ages["Charlie"] = 35;

3. 访问值

通过键访问字典中的值。

// 使用索引器访问
int aliceAge = ages["Alice"];
Console.WriteLine($"Alice's age: {aliceAge}");// 使用 TryGetValue 安全访问(避免键不存在时抛出异常)
if (ages.TryGetValue("Bob", out int bobAge))
{Console.WriteLine($"Bob's age: {bobAge}");
}
else
{Console.WriteLine("Bob's age not found.");
}

4. 修改值

通过键修改字典中的值。

// 修改 Alice 的年龄
ages["Alice"] = 31;
Console.WriteLine($"Alice's new age: {ages["Alice"]}");

5. 删除键值对

使用 Remove 方法删除指定键的键值对。

// 删除键为 "Bob" 的键值对
ages.Remove("Bob");// 检查是否删除成功
if (!ages.ContainsKey("Bob"))
{Console.WriteLine("Bob's age has been removed.");
}

6. 检查键或值是否存在

使用 ContainsKey 或 ContainsValue 方法检查字典中是否包含指定的键或值。

// 检查键是否存在
if (ages.ContainsKey("Alice"))
{Console.WriteLine("Alice is in the dictionary.");
}// 检查值是否存在
if (ages.ContainsValue(35))
{Console.WriteLine("Someone is 35 years old.");
}

7. 遍历字典

使用 foreach 循环遍历字典中的键值对。

foreach (var kvp in ages)
{Console.WriteLine($"{kvp.Key}: {kvp.Value}");
}// 单独遍历键或值
foreach (var key in ages.Keys)
{Console.WriteLine($"Key: {key}");
}foreach (var value in ages.Values)
{Console.WriteLine($"Value: {value}");
}

8. 清空字典

使用 Clear 方法清空字典中的所有键值对。

ages.Clear();
Console.WriteLine($"Dictionary count after clearing: {ages.Count}");

9. 获取字典的大小

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

Console.WriteLine($"Number of entries in the dictionary: {ages.Count}");

10. 初始化字典

可以在创建字典时直接初始化键值对。

Dictionary<string, int> ages = new Dictionary<string, int>
{{ "Alice", 30 },{ "Bob", 25 },{ "Charlie", 35 }
};

11. 处理键冲突

如果尝试添加一个已经存在的键,Add 方法会抛出 ArgumentException。可以使用 ContainsKey 方法检查键是否存在,或者使用索引器直接赋值。

if (!ages.ContainsKey("Alice"))
{ages.Add("Alice", 30);
}
else
{Console.WriteLine("Alice already exists in the dictionary.");
}

12. 字典的默认值

如果尝试访问不存在的键,索引器会抛出 KeyNotFoundException。可以使用 TryGetValue 方法避免异常。

if (ages.TryGetValue("David", out int davidAge))
{Console.WriteLine($"David's age: {davidAge}");
}
else
{Console.WriteLine("David's age not found.");
}

13. 使用自定义类型作为键

如果使用自定义类型作为键,需要确保该类型正确实现了 Equals 和 GetHashCode 方法,以便字典能够正确比较和查找键。

public class Person
{public string Name { get; set; }public int Age { get; set; }public override bool Equals(object obj){if (obj is Person other){return Name == other.Name && Age == other.Age;}return false;}public override int GetHashCode(){return Name.GetHashCode() ^ Age.GetHashCode();}
}// 使用自定义类型作为键
Dictionary<Person, string> personDescriptions = new Dictionary<Person, string>
{{ new Person { Name = "Alice", Age = 30 }, "Software Engineer" },{ new Person { Name = "Bob", Age = 25 }, "Data Scientist" }
};

14. 字典的性能

  • 查找Dictionary 的查找操作是 O(1) 时间复杂度,因为它是基于哈希表实现的。

  • 插入和删除:插入和删除操作的平均时间复杂度也是 O(1)。

  • 内存开销:由于哈希表的实现,Dictionary 会占用较多的内存。

15. 完整示例

以下是一个完整的示例,展示了字典的常见操作:

using System;
using System.Collections.Generic;class Program
{static void Main(){// 创建并初始化字典Dictionary<string, int> ages = new Dictionary<string, int>{{ "Alice", 30 },{ "Bob", 25 },{ "Charlie", 35 }};// 添加新键值对ages["David"] = 28;// 修改值ages["Alice"] = 31;// 删除键值对ages.Remove("Bob");// 遍历字典foreach (var kvp in ages){Console.WriteLine($"{kvp.Key}: {kvp.Value}");}// 检查键是否存在if (ages.ContainsKey("Charlie")){Console.WriteLine("Charlie is in the dictionary.");}// 获取字典大小Console.WriteLine($"Number of entries: {ages.Count}");}
}

相关文章:

C#中的字典怎么使用?

在C#中&#xff0c;Dictionary<TKey, TValue> 是一个泛型集合类&#xff0c;用于存储键值对&#xff08;key-value pairs&#xff09;。它提供了快速的查找、插入和删除操作&#xff0c;适合需要根据键快速查找值的场景。以下是 Dictionary 的基本用法和常见操作&#xf…...

vue框架后遗症∶被遗忘的dom操作

用多了vue、react等前端框架&#xff0c;不得不说用数据驱动视图来开发真的很香&#xff0c;但是也免不了会有不用这些框架的项目&#xff0c;dom操作还是很有必要的&#xff0c;一开始学习网页设计的时候就教过&#xff0c;后面一直开发项目基本上用框架。虽然有些想不起来了&…...

进程 ─── linux第10课

目录 回顾上一节 进程 基本概念 描述进程 - PCB task_struct - PCB的一种 task_ struct内容分类 组织进程 下面来介绍task_struct内部 PID 和PPID 子进程与父进程 getpid()和getppid() 杀进程 exe 和 cwd 回顾上一节 1. 如果我们写的程序要访问硬件,必定通过sy…...

线性模型 - 支持向量机

支持向量机&#xff08;SVM&#xff09;是一种用于分类&#xff08;和回归&#xff09;的监督学习算法&#xff0c;其主要目标是找到一个最佳决策超平面&#xff0c;将数据点分为不同的类别&#xff0c;并且使得分类边界与最近的数据点之间的间隔&#xff08;margin&#xff09…...

MyBatis-Plus注解配置:@TableName、@TableId、@TableField

MyBatis-Plus 是 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。MyBatis-Plus 提供了一系列注解,用于简化数据库表与实体类之间的映射关系。以下是 @TableName、@TableId 和 @TableField 这三个常用注解的配置和使用说明。 官方文档:…...

DeepSeek接入问题-Xshell5连接Ubuntu22失败解决方案

项目场景&#xff1a; deepseek部署常用系统Ubuntu系统&#xff0c; xshell5连接Ubuntu22遇到如下问题&#xff1a; 问题描述 xshell5连接Ubuntu22遇到如下问题&#xff1a; Connecting to 172.16.46.80:22... Could not connect to 172.16.46.80 (port 22): Connection fa…...

论文阅读之基于Syn2Real域的侧扫声纳类水雷目标探测

摘要 由于现实世界数据的稀缺性&#xff0c;基于深度学习的水下水雷探测受到了限制。这种稀缺性导致过拟合&#xff0c;即模型在训练数据上表现良好&#xff0c;但在未见数据上表现不佳。本文提出了一种使用扩散模型的Syn2Real &#xff08;Synthetic to Real&#xff09;域泛…...

【Java】Tomcat日志

Tomcat日志 tomcat 日志的配置文件是tomcat目录下的/conf/logging.properties。 日志输出级别&#xff1a;SEVERE (最高级别) > WARNING > INFO > CONFIG > FINE > FINER(精心) > FINEST (所有内容,最低级别) 日志分类 tomcat 有五类日志 &#xff1a; …...

datalist 是什么?

一、datalist 是什么&#xff1f; datalist 是 HTML5 引入的一个表单相关元素&#xff0c;它本质上是一个为输入框&#xff08;<input>&#xff09;提供预定义选项列表的容器。从外观上看&#xff0c;当用户在与之关联的输入框中进行输入操作时&#xff0c;会自动弹出一个…...

初阶数据结构(C语言实现)——3顺序表和链表(3)

3.链表 3.1 链表的概念及结构 概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的 链表的物理结构 1.从上图可看出&#xff0c;链式结构在逻辑上是连续的&#xff0c;但是在物理上不一定连续…...

Docker 数据卷管理及优化

Docker 数据卷是一个可供容器使用的特殊目录&#xff0c;它绕过了容器的文件系统&#xff0c;直接将数据存储在宿主机上。通过数据卷&#xff0c;可以实现数据的持久化、共享以及独立于容器生命周期的管理。 1.1 为什么要用数据卷 Docker 分层文件系统的特点 性能差&#xff…...

Hi3516CV610车牌识别算法源码之——车牌识别算法初体验

本文讲述如何使用Hi3516CV610开发板读取本地图片&#xff0c;运行车牌识别算法推理&#xff0c;得到车牌信息并打印&#xff1b; 下一篇将介绍Hi3516CV610开发板如何从sensor摄像头获取图像&#xff0c;运行车牌识别算法推理&#xff0c;得到车牌信息并打印&#xff1b; 一、准…...

使用内置命令查看笔记本电池健康状态

如何使用powercfg /batteryreport命令查看笔记本电池健康状态 在Windows系统中&#xff0c;了解笔记本电池的健康状态对于维护电脑性能和预测电池寿命至关重要。Windows 10和Windows 11系统提供了一个内置命令powercfg /batteryreport&#xff0c;可以生成一份详细的电池使用情…...

HONOR荣耀MagicBook 15 2021款 独显(BOD-WXX9,BDR-WFH9HN)原厂Win10系统

适用型号&#xff1a;【BOD-WXX9】 MagicBook 15 2021款 i7 独显 MX450 16GB512GB (BDR-WFE9HN) MagicBook 15 2021款 i5 独显 MX450 16GB512GB (BDR-WFH9HN) MagicBook 15 2021款 i5 集显 16GB512GB (BDR-WFH9HN) 链接&#xff1a;https://pan.baidu.com/s/1S6L57ADS18fnJZ1…...

transformer架构的语言模型保存的内容与格式详解

前文我们已经详细讲述了基于pytorch框架下的transformer架构如何从零开始构建一个小型字符级语言模型,构建过程中涵盖数据准备、模型架构设计、训练、评估与生成的整个流程。我们已经了解了各个部分的细节,而且已经提供了完整的python代码。现在需要了解我们构建好的模型如何…...

win本地vscode通过代理远程链接linux服务器

时间&#xff1a;2025.2.28 1. win本地下载nmap.exe nmap官网 https://nmap.org/或者 https://nmap.org/download#windows下载win版本并安装。 2. vscode插件Remote-SSH 插件下载Remote-SSH 3. 配置 按照图中顺序配置ssh 1.点击左侧工具栏的“小电视”图标 2.点击ssh的…...

【C++编程探索】01前缀和来临!优点多多!八千字详解

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 【PingdiGuo_guo&#xff1a;一名C、数据结构、算法等爱好者&#xff0c;用所学帮助大家&#xff0c;感谢关注&#xff01;】 新年刚过&#xff0c;在这里先祝各位 新年快乐&#xff01;&#xff01;&#xf…...

文件下载技术的终极选择:`<a>` 标签 vs File Saver.js

文件下载技术的终极选择&#xff1a;<a> 标签 vs File Saver.js 在 Web 开发中&#xff0c;文件下载看似简单&#xff0c;实则暗藏玄机。工作种常纠结于 <a> 标签的原生下载和 File Saver.js 等插件的灵活控制之间。本文将从原理、优缺点、场景对比到实战技巧&…...

《机器学习数学基础》补充资料:矩阵的LU分解

本文是对《机器学习数学基础》第2章2.3.3节矩阵LU分解的拓展。 判断是否可LU分解 并非所有矩阵都可以实现LU分解。 定理1&#xff1a; 若 n n n 阶可逆矩阵 A \pmb{A} A 可以进行LU分解&#xff0c;则 A \pmb{A} A 的 k k k 阶顺序主子阵&#xff08;leading principal s…...

[笔记.AI]AI知识科普提纲

仅供参考 1.AI基础认知 1.1什么是什么AI 1.2核心概念 1.2.1机器学习、深度学习、神经网络 1.2.2模型&#xff1a;模型、大模型、模型参数 1.2.3多模态 1.2.4生成式AI & 判别式AI 1.3发展与现状 2.大模型 2.1主流大模型 2.1.1分类 2.1.2各…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...

提升移动端网页调试效率:WebDebugX 与常见工具组合实践

在日常移动端开发中&#xff0c;网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时&#xff0c;开发者迫切需要一套高效、可靠且跨平台的调试方案。过去&#xff0c;我们或多或少使用过 Chrome DevTools、Remote Debug…...

什么是VR全景技术

VR全景技术&#xff0c;全称为虚拟现实全景技术&#xff0c;是通过计算机图像模拟生成三维空间中的虚拟世界&#xff0c;使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验&#xff0c;结合图文、3D、音视频等多媒体元素…...