首页 > 编程语言 >C#数据结构 字典Dictionary

C#数据结构 字典Dictionary

时间:2024-02-23 23:33:07浏览次数:28  
标签:24 哈希 Dictionary C# testDic key Add Key 数据结构

简介

字典是C#开发中经常使用的一种键值对容器,类似C++的map,可使用foreach或迭代器遍历 不能装多个相同key,底层实现是哈希函数

具体用法

1.创建

Dictionary<key, value>
// Key和 Value可以是任意类型
Dictionary<int, string> _testDic = new Dictionary<int, string>();

2.添加元素 Add

.Add(key, value) , 相同相同Key值只能Add一次
// 2.添加元素
_testDic.Add(24, "Canon");
// 注意相同相同Key值只能Add一次
_testDic.Add(24, "Jason");// 报错:System.ArgumentException:“已添加了具有相同键的项。”
// 可以使用ContainsKey判断字典中是否已经存在
if (!_testDic.ContainsKey(24))  _testDic.Add(24, "Canon");

3.删除元素 Remove

Remove(key) 删除不存在的值不会报错
// 3.删除元素
// Remove 删除不存在的值不会报错
_testDic.Remove(24);

4.查询取值

类似C++中的map,可直接用方括号map[key]取值
// 4.取值
// 索引器取值,若字典中没有Key会报错
string str = _testDic[24];

// TryGetValue 使用一个输出参数,取值成功返回true,内部对str赋值,否则返回false
bool isExist = _testDic.TryGetValue(24, out str);

5.改值

也可通过方括号访问改值 map[key] = XXX;
// 5.改值
// 要确保字典中确实存在该值
if (_testDic.ContainsKey(1))  _testDic[1] = "";

6.遍历

可使用foreach遍历,也可使用迭代器遍历
// 6.遍历
// Key
foreach (var key in _testDic.Keys) Console.WriteLine("Key = {0}", key);
// Value
foreach (var value in _testDic.Values) Console.WriteLine("value = {0}", value);
// foreach遍历
foreach (var kvp in _testDic) Console.WriteLine("Key = {0}, Value = {1}", kvp.Key, kvp.Value);


// 迭代器遍历
var enumerator = _testDic.GetEnumerator();
while (enumerator.MoveNext())
{
        var kvp = enumerator.Current;
        Console.WriteLine("Key = {0}", kvp.Key);
        Console.WriteLine("Key = {0}", kvp.Value);
}
 

字典底层实现:哈希函数

哈希函数 字典的Key——Value映射是利用哈希函数来建立的。 什么是哈希函数呢? 把一个对象转换成唯一且确定值的函数就叫做哈希函数,也叫做散列函数。 这个值就叫做哈希码(hashCode),在C#里一般是一个32位正整数。 就好比每一个人都对应一个身份证号码。

标签:24,哈希,Dictionary,C#,testDic,key,Add,Key,数据结构
From: https://www.cnblogs.com/jk-2048/p/18030585

相关文章

  • 刘铁猛C#学习笔记13 委托1
    “幻想:如果能有一种能把方法当参数的方法就好了”一、什么是委托委托源自C、C++中的函数指针 1.C语言中的函数指针(1)函数的直接调用先准备好一个加法函数,一个减法函数可以通过函数名调用这两个函数,这种调用方法称作直接调用 (2)函数指针的声明、间接调用先按下......
  • C++ 令人无语/好用的语法合集
    此贴用来总结一些傻逼C++语法,或者坑了我很久的写法。1、(坑)重载>,<,==时,千万不要使用pair为基的typedef!!!!!!pii的max不受你的重载影响,它自己有自己的max,然后typedef和define是相同的,基本可以看做直接替换,不会对作用域/命名做区分。2、(坑)lower_bound(..,..,{x......
  • containerd环境搭建指南
    目录一.container概述1.什么是containerd2.为什么要学习containerd二.基于yum方式安装containerd1.获取软件源2.查看yum源中containerd软件版本3.安装containerd的4.查看containerd的版本信息5.设置containerd开机自启动6.查看containerd的客户端和服务端的版本信息三.基于二进制......
  • SciTech-EECS-PCB电路板设计-使用KiCad进行PCB设计的基本流程
    使用KiCad进行PCB设计的基本流程,2024-02-2314:04KiCad是一款强大的开源PCB设计软件,其设计的大体流程包括:原理图设计及导出网表文件,PCB布局和布线,导出Gerber文件及制板;以下是使用KiCad进行PCB设计的基本步骤:0.安装KiCad:首先,你需要安装KiCad软件。KiCad官方网站下载......
  • 刘铁猛C#学习笔记10 字段、属性
    这四种东西都是用来表达数据的一、字段(成员变量)曾用名:成员变量是为一个对象或类型存储数据的变量,区别于方法体中的局部变量多个字段组合起来可以表示对象当前的状态起源:C语言中结构体的成员变量一个对象占用的内存空间会被分配给各个字段1.实例字段和静态字段可以分为......
  • 刘铁猛C#学习笔记11 索引器、常量
    一、索引器[]概述使一个对象可以像数组一样用方括号[]去访问其元素ex:字典的声明 1.索引器的声明首先像上文那样声明一个字典Dictionary<,>在VS中输入indexer,然后敲两下tab就能得到:(按下tab可以跳到下一个可编辑项上)第一个类型参数为返回值的类型,第二个类型参数为......
  • 刘铁猛C#学习笔记12 参数种类详解
    一、值参数(传值参数、值传递)指参数的种类为值参数,而非参数数据类型为值类型1.值类型的传值参数类似一个新声明的局部变量,或传进来的实参的一个副本可以在方法体内重现赋值,但其在方法体内被赋值时,不会影响传进来的本体 2.引用类型的传值参数引用类型变量存储的是实例......
  • 代码随想录算法训练营day03 | leetcode 203. 移除链表元素、707. 设计链表、206. 反转
    目录题目链接:203.移除链表元素-简单题目链接:707.设计链表-中等题目链接:206.反转链表-简单题目链接:203.移除链表元素-简单题目描述:给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val==val的节点,并返回新的头节点。示例1:输入:head=[1,2,6......
  • 恢复VCPkg(2023-01-27)中Vtk[Qt]的默认依赖为Qt5
    通过查看vtk的更新的日志已于2023-01-27将默认依赖的Qt的版本由5更新到6gitlog--.\ports\vtkcommit27fb19bdcc1f6ddb1261cffb5372724ac1d63a93Author:LilyWang<[email protected]>Date:2023-08-23[manyports]FixURLSofdownlo......
  • P9370 APIO2023 cyberland
    题面:https://www.luogu.com.cn/problem/P9370显然只有从\(0\)出发不经过\(H\)能到达的点是有用的。首先,考虑跑多源最短路,将\(arr=0\)的点都作为源点(当然\(0\)也是源点)。不难发现这样转化后,这些点即可视作\(arr=1\)。对于\(arr=2\)的点,由于能使用除以二技能的次数很......