基本概念

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 详解的更多相关文章

  1. C#中Hashtable、Dictionary详解以及写入和读取对比

    转载:http://www.cnblogs.com/chengxingliang/archive/2013/04/15/3020428.html 在本文中将从基础角度讲解HashTable.Dicti ...

  2. C# 集合之Dictionary详解

    开讲. 我们知道Dictionary的最大特点就是可以通过任意类型的key寻找值.而且是通过索引,速度极快. 该特点主要意义:数组能通过索引快速寻址,其他的集合基本都是以此为基础进行扩展而已. 但其索 ...

  3. 1、C#中Hashtable、Dictionary详解以及写入和读取对比

    在本文中将从基础角度讲解HashTable.Dictionary的构造和通过程序进行插入读取对比. 一:HashTable 1.HashTable是一种散列表,他内部维护很多对Key-Value键值对 ...

  4. Linq之旅:Linq入门详解(Linq to Objects)

    示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...

  5. ASP.NET Core的配置(2):配置模型详解

    在上面一章我们以实例演示的方式介绍了几种读取配置的几种方式,其中涉及到三个重要的对象,它们分别是承载结构化配置信息的Configuration,提供原始配置源数据的ConfigurationProvi ...

  6. Ajax.ActionLink参数详解

    该语法会生成一个a标签,点击a标签会执行一个Ajax请求. 有12个方法重载,下面详解方法中的各项参数: 参数一:linkText string类型 说明:链接显示的文字内容 参数二:actionNa ...

  7. Ajax.BeginForm参数详解

    在Asp.Net的MVC中的语法,在Razor页面中使用,替代JQuery的Ajax使用,方便快捷. 使用Ajax.BeginForm方法会生成一个form表单,最后以Ajax的方式提交表单数据:需要 ...

  8. Cocos2d-x 3.X手游开发实例详解

    Cocos2d-x 3.X手游开发实例详解(最新最简Cocos2d-x手机游戏开发学习方法,以热门游戏2048.卡牌为例,完整再现手游的开发过程,实例丰富,代码完备,Cocos2d-x作者之一林顺和泰 ...

  9. AFNetworking 与 UIKit+AFNetworking 详解

    资料来源 : http://github.ibireme.com/github/list/ios GitHub : 链接地址 简介 : A delightful iOS and OS X networ ...

  10. SUBLIME TEXT 2 设置文件详解

    SUBLIME TEXT 2 设置文件详解 Preferences.sublime-settings文件: // While you can edit this file, it’s best to ...

随机推荐

  1. MybatisPlusException: can not find lambda cache for this entity[]异常解决

    文章目录 场景说明 解决方案 场景说明   简单来说,我们系统中许多数据都是树状结构的,所以我定义了一个实体类父类BaseTreePO,并且想封装一个通用的树状对象的Service类,部分代码如下: ...

  2. MAC brew install 跳过 update

    相信很多用 MAC 小伙伴的小伙伴都对 HomeBrew 很熟悉. 但是! 都遇到过这样的问题, 每次安装新东西, 它都要先去 update 一下, 那个耗时啊-. 怎么才能不 update, 直接安 ...

  3. Qt开发经验小技巧111-120

    在不同的平台上文件路径的斜杠也是不一样的,比如linux系统一般都是 / 斜杠,而在windows上都是 \ 两个反斜杠,Qt本身程序内部无论在win还是linux都支持 / 斜杠的路径,但是一些第三 ...

  4. Qt音视频开发11-ffmpeg常用命令

    一.前言 大部分的格式转换工具比如格式化工厂等,都用到了ffmpeg来处理,ffmpeg编译后生成的ffmpeg.exe.ffplay.exe.ffprobe.exe等可执行文件,其实就封装了众多牛逼 ...

  5. [转]boost使用之编译库及遇到的问题

    最近因为在学习网络编程相关的东西,准备学习一下boost,毕竟原生的网络编程太麻烦.看了一下其实windows下想使用起来很简单,就是下载库,然后运行脚本,然后运行exe库就出来.在把头文件和库的目录 ...

  6. 阿里IM技术分享(七):闲鱼IM的在线、离线聊天数据同步机制优化实践

    本文由阿里闲鱼技术团队书闲分享,原题"如何有效缩短闲鱼消息处理时长",有修订和改动,感谢作者的分享. 1.引言 闲鱼技术团队围绕IM这个技术范畴,已经分享了好几篇实践性总结文章,本 ...

  7. Web端IM系统:RainbowChat-Web v4.0发布

    关于RainbowChat-Web ► RainbowChat-Web详细介绍:http://www.52im.net/thread-2483-1-1.html► 历史版本更新记录:http://ww ...

  8. UWP 检查是否试用版模式

    //老版本的方法: // var check= CurrentAppSimulator.LicenseInformation.IsActive && CurrentAppSimulat ...

  9. paddle安装中 libssl-1_1-x64.dll 的版本问题

    paddle安装过程中出现的一些问题: 在学习tensorflow过程中,了解到paddlepaddle,本着技多不压身的原则也了解了一下,但是在安装的时候碰到了一些问题.特地记录一下. 一.&quo ...

  10. Win10部分软件程序中输入中文变成问号??如何处理【详细步骤】

    近期在win10系统中,出现了一个问题,那就是在部分程序软件中输入中文之后,会直接显示问号,哪怕是更换输入法也没有任何用.那么遇到这个问题,我们要如何处理呢?下面IT百科分享一下Win10系统部分软件 ...