C# Dictionary(数据字典)的基本用法 - Mr.Cat~ - 博客园 (cnblogs.com)

 

通常情况下,我们可以通过 int 类型的索引来从数组或者 List 集合中查询所需的数据

但是如果情况稍微复杂一点:索引是非 int 类型的数据(比如 string 或其他类型),这时候就需要使用字典

顾名思义,数据字典就是一种让我们可以通过索引查询到特定数据的数据结构类型,它的关键字就是:Dictionary

Dictionary 用法

1、value 为字符串类型的值:Dictionary<string,string> MyDt = new Dictionary<string,string>();

2、value 为对象类型的值:Dictionary<string,List<object>> myDt = new Dictionary<string,List<object>>();

Dictionary 注意事项

  • C# 的 Dictionary<Tkey,TValue> 通过类在内部维护两个数组来实现功能:一个 keys 数组容纳要从其映射的键,另一个 values 容纳映射到的值

  在 Dictionary<Tkey,TValue> 集合中插入键 / 值对时,将自动记录哪个键和哪个值关联,从而允许开发人员快速和简单地获取具有指定键的值

  • C# Dictionary<Tkey,TValue> 集合不能包含重复的键:调用 Add 方法添加键数组中已有的键将抛出异常

  可用 ContainKey 方法测试 Dictionary<Tkey,TValue> 集合是否已包含特定的键

  • Dictionary<Tkey,TValue> 集合内部采用一种稀疏数据结构,在有大量内存可用时才最高效

  随着更多元素的插入,Dictionary<Tkey,TValue> 集合可能快速消耗大量的内存

  • 用 foreach 遍历 Dictionary<Tkey,TValue> 集合返回一个 KeyValuePair<Tkey,TValue>

  该结构包含数据项的键和值拷贝,可通过 Key 和 Value 属性访问每个元素

  获得的元素是只读的,不能用它们修改 Dictionary<Tkey,TValue> 集合中的数据

Dictionary 遍历

遍历方法:

  1. 遍历 Key
  2. 遍历 Value
  3. 遍历 Key-Value
  • 遍历 string 型 value
static void Main(string[] args)
{
//创建一个字典
Dictionary<int, string> MyDh = new Dictionary<int, string>();
MyDh.Add(1, "aaa");
MyDh.Add(2, "bbb");
MyDh.Add(3, "ccc");
MyDh.Add(4, "ddd");
//遍历 Key
Console.WriteLine("遍历 Key 结果:");
foreach (int Key in MyDh.Keys)
{
Console.WriteLine(Key);
}
//遍历 Value
Console.WriteLine("遍历 Value 结果:");
foreach (string value in MyDh.Values)
{
Console.WriteLine(value);
}
//遍历 Key-Value
Console.WriteLine("遍历 Key-Value 结果:");
foreach (KeyValuePair<int, string> item in MyDh)
{
Console.WriteLine(item.Key + "\t" + item.Value);
}
}

遍历得到的结果如下:

Dictionary 取值

常用的取值方法有 2 种:

方法 1:先判断是否存在,如果存在再进行取值

if(aDictionary.ContainsKey(key))
{
var value = Dictionary[key];
}

方法 2:使用 TryGetValue

int value;
aDictionary.TryGetValue(key, out value);

在项目中,如果只是取值,推荐使用 TryGetValue 来获取

原因:

方法 1 中 ContainsKey 执行了一次方法,Dictionary[Key] 再次执行了一次方法,整个取值过程调用了两次方法

而方法 2 的 TryGetValue 只调用了一次方法,当然并不是调用的方法越多就越耗性能

判断在字典中是否存在一般会通过 Key 来获取 HashCode,然后通过 Equal 对值进行比对

字典存储中会给 Key 一个对应的 HashCode,如果数据过多,那么 HashCode 也可能重复,所以需要再次进行比较,时间主要花费在这上面

总结:

如果只是取值,直接用 TryGetValue 花费更小、更快、更安全,找不到 Value 时将返回 False

C# Dictionary(数据字典)的基本用法的更多相关文章

  1. Data Dictionary 数据字典

    数据字典是一种通用的程序设计方法.可以认为,不论什么程序,都是为了处理一定的主体,这里的主体可能是人员.商品(超子).网页.接口.数据库表.甚至需求分析等等.当主体有很多的属性,每种属性有很多的取值, ...

  2. (转)C#中键值对类型Hashtable与Dictionary比较和相关用法

    最近在使用C#中的Hashtable与Dictionary的时候,想知道其区别,通过查找网络相关博客资料,作出下列总结. Hashtable与Dictionary虽然都是作为键值对的载体,但是采用的是 ...

  3. Dictionary<Key,Value>的用法

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  4. C#中Dictionary的作用及用法讲解

    Dictionary<string, string>是一个泛型 他本身有集合的功能有时候可以把它看成数组 他的结构是这样的:Dictionary<[key], [value]> ...

  5. 关于python词典(Dictionary)的get()用法

    先贴出参考链接:http://www.runoob.com/python/att-dictionary-get.html get()方法语法: dict.get(key, default=None) ...

  6. oracle 数据字典

    select * from dictionary; --数据字典 数据字典是Oracle存放有关数据库信息的地方,其用途是用来描述数据的. 比如一个表的创建者信息,创建时间信息,所属表空间信息,用户访 ...

  7. 无废话版本-Asp.net MVC4.0 Rasor的基本用法

    最近工作有点忙,好久没写东西了!废话不多说了,进入主题! 1.在页面中输出单一变量时候,只要在C#语句之前加上@符号即可,For example: <p>Now Time:@DateTim ...

  8. Oracle数据字典详解

    学习笔记:oracle数据字典详解 --- 本文为TTT学习笔记,首先介绍数据字典及查看方法,然后分类总结各类数据字典的表和视图.然后列出一些附例.   数据字典系统表,保存在system表空间中. ...

  9. 6种innodb数据字典恢复方法

    6种innodb数据字典恢复方法 https://dev.mysql.com/doc/refman/5.7/en/innodb-troubleshooting-datadict.html frm文件重 ...

  10. C# 存储相同键多个值的Dictionary

    涉及到两个问题: 一.访问磁盘中文件夹.文件夹下面的文件夹 先看一下磁盘文件夹结构 C盘下面有个根文件夹SaveFile,SaveFIle下面有两个子文件夹分别为,2018.2019, 子文件下201 ...

随机推荐

  1. Html飞机大战(十三): 暂停状态编辑

    好家伙,本篇介绍如何添加暂停状态 按照惯例我们依旧先分析思路 什么时候游戏应该暂停? 当我的鼠标不在游戏画面内了,我们就可以直接暂停了 在当我的鼠标回来以后,我们继续进行游戏 所以我们可以监听一个鼠标 ...

  2. 【Azure 应用服务】App Service for Windows 环境中为Tomcat自定义4xx/5xx页面

    问题描述 通过设置Java Web项目,实现在App Service For Windows环境中达到自定义4XX/5XX的页面效果 问题解答 第一步:在本地项目文件中打开web.xml文件 (src ...

  3. 【Azure API 管理】APIM关闭开发者门户的办法

    问题描述 APIM默认提供了开发者门户,可以让用户体验如何来调用接口.但如果不想开发这个功能的情况下,是否有办法关闭呢? 问题解答 答案是:开发人员门户是没有办法关闭的.但是作为另一种的代替方案,如自 ...

  4. vmware完全卸载 防止出现各种问题治标不治本

    首先打开系统盘根目录,搜索" VMware ",把搜到的都删掉,去控制面板那里卸载掉VMware 打开管理(右键"我的电脑"),管理打开设备管理器," ...

  5. Python回顾面向对象

    [一]面向过程开发和面向对象开发 [1]面向过程包括函数和面条 包括面条版本一条线从头穿到尾 学习函数后开始对程序进行分模块,分功能开发 学习模块化开发,我们就可以对我们的功能进行分类开发 建一个功能 ...

  6. C#串口开发之SerialPort类封装

    目录 SerialPort类 参数封装 控件操作封装 SerialPortClient类实现 SerialPortClient类使用 测试Demo 参考文章 SerialPort类 微软在.NET中对 ...

  7. python librosa 实例解析

    一 概念 librosa是一个用于音乐和音频分析的python包.它提供了创建音乐信息检索系统所需的构建块. 核心函数:   二 实例解析   实例A,确认是否安装成功: import librosa ...

  8. 记springBoot一直报Exception authenticating MongoCredential.

    项目场景: 场景:继上回docker安装好了mongo,然后自己本地项目尝试搭建使用连接mongo 问题描述: 按照别人写的文章教程一步步操作,最后自己本地尝试连接查询,跳出这个用户权限不够,发生了套 ...

  9. Tomcat异常之 Exception loading sessions from persistent storage解决方案

    启动项目时报以下异常 严重: Exception loading sessions from persistent storage java.io.EOFException 遇到上述异常,删除Tomc ...

  10. JSF标签之f:facet 的使用方法

    f:facet标签用来为包含f:facet标签的父组件与被f:facet标签所包含的子组件之间申明一种特殊的关系.常与h:panelGrid,h:dataTable等标签连用,申明组件为标题或页脚. ...