C#之 Dictionary 详解
基本概念
Dictionary<TKey, TValue>是C#中用于存储键值对集合的泛型类,属于System.Collections.Generic命名空间。它允许使用键(Key)来访问与其关联的值(Value)。其中,TKey表示字典中键的类型,TValue表示字典中值的类型。
Dictionary的基本结构
- 键(Key):唯一标识集合中的一个元素。键是唯一的,不能有重复。
- 值(Value):与键相关联的数据。值可以是任意类型,并且可以有重复。
- 键值对(KeyValuePair):键和值的组合,表示Dictionary中的一个元素。
Dictionary的主要特性
- 快速访问:通过键可以快速检索到对应的值,平均时间复杂度接近O(1),因为
Dictionary<TKey,TValue>类是作为哈希表实现。 - 唯一键(Key):每个键在Dictionary中都是唯一的,不能重复。
- 动态大小:Dictionary的大小可以动态调整,当元素数量超过容量时,它会自动扩容。
- 无序集合:Dictionary中的元素是无序的,不能通过索引来访问它们。
Dictionary的常用操作
以下是C#中Dictionary的常用操作完整代码,其中包括添加元素、访问元素、修改元素、删除元素、检查键或值是否存在,以及遍历元素:
public static void DictionaryOperation()
{
//创建一个Dictionary来存储学生学号ID和姓名
Dictionary<int, string> studentDic = new Dictionary<int, string>();
#region 添加元素
// Add方法(键必须唯一)
studentDic.Add(1, "大姚");
studentDic.Add(2, "小袁");
studentDic.Add(3, "Edwin");
// 索引器语法(键不存在时添加,存在时更新)
studentDic[4] = "Charlie";
studentDic[5] = "追逐时光者";
// 安全添加(避免异常)
bool isAdded = studentDic.TryAdd(6, "小明"); // 返回 false,因键已存在
#endregion
#region 访问元素
// 直接访问(键必须存在,否则会有异常)
var currentUserName = studentDic[1];
Console.WriteLine($"当前学生姓名: {currentUserName}");
// 安全访问(避免异常)
if (studentDic.TryGetValue(5, outvar getUserName))
{
Console.WriteLine($"UserName:{getUserName}");
}
else
{
Console.WriteLine("当前学生ID不存在");
}
#endregion
#region
// 修改元素
studentDic[2] = "大西瓜";
Console.WriteLine($"修改后的名称:{studentDic[2]}");
#endregion
#region 删除元素
// 删除元素
bool isRemoved = studentDic.Remove(3);
Console.WriteLine($"删除结果:{isRemoved}");
#endregion
#region 检查键或值是否存在
// 检查键是否存在
if (studentDic.ContainsKey(1))
{
Console.WriteLine("存在");
}
else
{
Console.WriteLine("不存在");
}
bool isExistcontainsValue = studentDic.ContainsValue("追逐时光者");
Console.WriteLine($"是否存在:{isExistcontainsValue}");
#endregion
#region 遍历元素
// 遍历元素
foreach (KeyValuePair<int, string> student in studentDic)
{
Console.WriteLine($"ID: {student.Key}, Name: {student.Value}");
}
// 使用键的枚举器
foreach (var key in studentDic.Keys)
{
Console.WriteLine($"Key: {key}, Value: {studentDic[key]}");
}
// 使用值的枚举器
foreach (varvaluein studentDic.Values)
{
// 注意:这种方式不能直接获取键,只能获取值
Console.WriteLine($"Value: {value}");
}
#endregion
}
参考文章
- https://learn.microsoft.com/zh-cn/dotnet/api/system.collections.generic.dictionary-2?view=net-9.0
C#之 Dictionary 详解的更多相关文章
- C#中Hashtable、Dictionary详解以及写入和读取对比
转载:http://www.cnblogs.com/chengxingliang/archive/2013/04/15/3020428.html 在本文中将从基础角度讲解HashTable.Dicti ...
- C# 集合之Dictionary详解
开讲. 我们知道Dictionary的最大特点就是可以通过任意类型的key寻找值.而且是通过索引,速度极快. 该特点主要意义:数组能通过索引快速寻址,其他的集合基本都是以此为基础进行扩展而已. 但其索 ...
- 1、C#中Hashtable、Dictionary详解以及写入和读取对比
在本文中将从基础角度讲解HashTable.Dictionary的构造和通过程序进行插入读取对比. 一:HashTable 1.HashTable是一种散列表,他内部维护很多对Key-Value键值对 ...
- Linq之旅:Linq入门详解(Linq to Objects)
示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...
- ASP.NET Core的配置(2):配置模型详解
在上面一章我们以实例演示的方式介绍了几种读取配置的几种方式,其中涉及到三个重要的对象,它们分别是承载结构化配置信息的Configuration,提供原始配置源数据的ConfigurationProvi ...
- Ajax.ActionLink参数详解
该语法会生成一个a标签,点击a标签会执行一个Ajax请求. 有12个方法重载,下面详解方法中的各项参数: 参数一:linkText string类型 说明:链接显示的文字内容 参数二:actionNa ...
- Ajax.BeginForm参数详解
在Asp.Net的MVC中的语法,在Razor页面中使用,替代JQuery的Ajax使用,方便快捷. 使用Ajax.BeginForm方法会生成一个form表单,最后以Ajax的方式提交表单数据:需要 ...
- Cocos2d-x 3.X手游开发实例详解
Cocos2d-x 3.X手游开发实例详解(最新最简Cocos2d-x手机游戏开发学习方法,以热门游戏2048.卡牌为例,完整再现手游的开发过程,实例丰富,代码完备,Cocos2d-x作者之一林顺和泰 ...
- AFNetworking 与 UIKit+AFNetworking 详解
资料来源 : http://github.ibireme.com/github/list/ios GitHub : 链接地址 简介 : A delightful iOS and OS X networ ...
- SUBLIME TEXT 2 设置文件详解
SUBLIME TEXT 2 设置文件详解 Preferences.sublime-settings文件: // While you can edit this file, it’s best to ...
随机推荐
- MybatisPlusException: can not find lambda cache for this entity[]异常解决
文章目录 场景说明 解决方案 场景说明 简单来说,我们系统中许多数据都是树状结构的,所以我定义了一个实体类父类BaseTreePO,并且想封装一个通用的树状对象的Service类,部分代码如下: ...
- MAC brew install 跳过 update
相信很多用 MAC 小伙伴的小伙伴都对 HomeBrew 很熟悉. 但是! 都遇到过这样的问题, 每次安装新东西, 它都要先去 update 一下, 那个耗时啊-. 怎么才能不 update, 直接安 ...
- Qt开发经验小技巧111-120
在不同的平台上文件路径的斜杠也是不一样的,比如linux系统一般都是 / 斜杠,而在windows上都是 \ 两个反斜杠,Qt本身程序内部无论在win还是linux都支持 / 斜杠的路径,但是一些第三 ...
- Qt音视频开发11-ffmpeg常用命令
一.前言 大部分的格式转换工具比如格式化工厂等,都用到了ffmpeg来处理,ffmpeg编译后生成的ffmpeg.exe.ffplay.exe.ffprobe.exe等可执行文件,其实就封装了众多牛逼 ...
- [转]boost使用之编译库及遇到的问题
最近因为在学习网络编程相关的东西,准备学习一下boost,毕竟原生的网络编程太麻烦.看了一下其实windows下想使用起来很简单,就是下载库,然后运行脚本,然后运行exe库就出来.在把头文件和库的目录 ...
- 阿里IM技术分享(七):闲鱼IM的在线、离线聊天数据同步机制优化实践
本文由阿里闲鱼技术团队书闲分享,原题"如何有效缩短闲鱼消息处理时长",有修订和改动,感谢作者的分享. 1.引言 闲鱼技术团队围绕IM这个技术范畴,已经分享了好几篇实践性总结文章,本 ...
- Web端IM系统:RainbowChat-Web v4.0发布
关于RainbowChat-Web ► RainbowChat-Web详细介绍:http://www.52im.net/thread-2483-1-1.html► 历史版本更新记录:http://ww ...
- UWP 检查是否试用版模式
//老版本的方法: // var check= CurrentAppSimulator.LicenseInformation.IsActive && CurrentAppSimulat ...
- paddle安装中 libssl-1_1-x64.dll 的版本问题
paddle安装过程中出现的一些问题: 在学习tensorflow过程中,了解到paddlepaddle,本着技多不压身的原则也了解了一下,但是在安装的时候碰到了一些问题.特地记录一下. 一.&quo ...
- Win10部分软件程序中输入中文变成问号??如何处理【详细步骤】
近期在win10系统中,出现了一个问题,那就是在部分程序软件中输入中文之后,会直接显示问号,哪怕是更换输入法也没有任何用.那么遇到这个问题,我们要如何处理呢?下面IT百科分享一下Win10系统部分软件 ...