C#中字典Dictionary的实现原理

在这里插入图片描述

在 C# 中,字典的实现通常使用哈希表。Dictionary<TKey, TValue> 类就是 C# 中的哈希表实现之一。

哈希表的数据结构:

Dictionary<TKey, TValue>
内部使用了哈希表的数据结构来存储键值对。哈希表通常是一个数组,每个数组元素通常称为桶(Bucket),每个桶可以存储一个键值对或者一条链表(用于解决哈希冲突)。

  1. 哈希函数:
    Dictionary<TKey, TValue> 使用键的哈希码作为索引来存储对应的值。在添加键值对时,会首先计算键的哈希码,然后根据哈希码找到对应的桶,将键值对存储在该桶中。

  2. 解决哈希冲突:
    当不同的键计算得到的哈希码相同时,会发生哈希冲突。Dictionary<TKey, TValue> 使用开放地址法中的线性探测法来解决哈希冲突。具体来说,如果计算得到的桶已经被占用,就会线性地向后查找直到找到一个空闲的桶为止。

  3. 动态扩容:
    为了避免哈希表过度拥挤,Dictionary<TKey, TValue> 会在需要时自动进行动态扩容。当哈希表中的元素数量达到一定阈值时,会重新分配更大的数组,并将原有的键值对重新散列到新的数组中,以保持哈希表的性能。

  4. 查找性能:
    由于哈希表的特性,Dictionary<TKey, TValue> 的查找、插入和删除操作的平均时间复杂度都是 O(1)。但在最坏情况下,如果哈希函数设计不当或者哈希表过度拥挤,查找性能可能会降低到 O(n)。

Dictionary<TKey, TValue> 类在 C# 中提供了一种高效的键值对存储和查找的数据结构,它的内部实现基于哈希表,通过合适的哈希函数和解决哈希冲突的方法,能够在大多数情况下保持高效的性能表现。

如果你有大量数据需要重复多次查询的,可以用字典实现

using System;
using System.Collections.Generic;class Program
{static void Main(){// 创建一个字典Dictionary<int, string> dict = new Dictionary<int, string>();// 向字典中添加键值对dict.Add(1, "One");dict.Add(2, "Two");dict.Add(3, "Three");// 通过键快速查找值Console.WriteLine(dict[2]); // 输出: Two}
}

常用的 Dictionary<TKey, TValue> 方法整理:

  • Add(TKey key, TValue value): 向字典中添加指定的键值对。如果字典中已存在相同的键,则会抛出 ArgumentException 异常。

  • Remove(TKey key): 从字典中移除具有指定键的键值对。如果字典中不存在该键,则不会抛出异常。

  • TryGetValue(TKey key, out TValue value): 获取与指定键相关联的值,并将该值存储在 value 参数中。如果字典中存在指定的键,则返回 true;否则返回 false。

  • ContainsKey(TKey key): 判断字典中是否包含指定的键。

  • ContainsValue(TValue value): 判断字典中是否包含指定的值。

  • Clear(): 移除字典中的所有键值对,将字典清空。

  • Count: 获取字典中包含的键值对数量。

  • Keys: 获取一个包含字典中所有键的集合,通常用于遍历字典中的键。

  • Values: 获取一个包含字典中所有值的集合,通常用于遍历字典中的值。

  • GetEnumerator(): 返回一个可用于循环访问字典中的键值对的枚举器(enumerator)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/494269.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

导入arviz出现的错误

导入arviz时&#xff0c;很有可能出现 UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0xba in position 2367: illegal multibyte sequence 这是因为我们的操作系统环境引起的。通过仔细阅读错误信息&#xff0c;可以定位出是pathlib.py中的read_text不传encoding参数…

OSI参考模型和TCP/IP网络参考模型

1、OSI参考模型 1.1 产生背景 为了解决网络之间的兼容性问题,实现网络设备间的相互通讯,国际标准化组织ISO于1984年提出了OSIRM(Open System Interconnection Reference Model,开放系统互连参考模型)。OSI参考模型很快成为计算机网络通信的基础模型。由于种种原因,并没有…

第二证券:买什么股比较安全?买股小技巧!

股票与基金、银行存款相比较&#xff0c;其危险性较高&#xff0c;不同类型的个股&#xff0c;其危险性有所不同&#xff0c;其中购买以下类型的个股&#xff0c;安全性相对来说要高一点&#xff1a; 1、权重股 权重股与中小盘股相比较&#xff0c;其流通盘较大&#xff0c;涨…

加购与心愿单:提升亚马逊产品排名的双重利器

作为亚马逊卖家&#xff0c;我一直在寻找提升产品排名和销量的方法。最近&#xff0c;我尝试了使用亚马逊鲲鹏系统来优化关键词排名和增加转化率&#xff0c;我想分享一下我的使用体验和反馈。 首先&#xff0c;我深入了解了亚马逊关键词排名的原理&#xff0c;意识到通过加购可…

【分享】WinRAR解压缩软件的3个密码功能

WinRAR是一款功能强大的解压缩软件&#xff0c;除了用来解压缩文件&#xff0c;还可以作为加密软件&#xff0c;给压缩包设置密码&#xff0c;达到保护文件的目的。今天来分享一下WinRAR的3个密码功能&#xff0c;一起来看看吧&#xff01; 功能一&#xff1a;设置“打开密码”…

WPF 附加属性+控件模板,完成自定义控件。建议观看HandyControl源码

文章目录 相关连接前言需要实现的效果附加属性添加附加属性&#xff0c;以Test修改FontSize为例依赖属性使用触发器使用直接操控 结论 控件模板&#xff0c;在HandyControl的基础上面进行修改参考HandyControl的源码控件模板原型控件模板 控件模板触发器完整样式简单使用 结论 …

SwiftUI中的 WebView

SwiftUI中的WebView是一个用于显示网页内容的视图。它是使用WebKit框架的一个封装。 要在SwiftUI中使用WebView&#xff0c;你可以按照以下步骤操作&#xff1a; 首先&#xff0c;导入WebKit框架&#xff1a; import WebKit创建一个WebView实例&#xff1a; struct WebView…

学习pybind11:Hello World例子

首先要明白pybind11是干啥的&#xff0c;对于一个C/C库&#xff0c;可以用pybind11封装它的接口为Python接口&#xff0c;这样得到一个python库&#xff0c;就可以把功能强大的库丢给使用python的boys & girls使用了~ 因此&#xff0c;使用pybind11做封装&#xff0c;是我…

Stable Diffusion 绘画入门教程(webui)-ControlNet(Shuffle)

Shuffle(随机洗牌)&#xff0c;这个预处理器会把参考图的颜色打乱搅拌到一起&#xff0c;然后重新组合的方式重新生成一张图&#xff0c;可以想象出来这是一个整体风格控制的处理器。 那么问题来了&#xff0c;官方为啥会设计个这样的处理器呢&#xff0c;主要是给懒人用的&am…

ConvNeXt V2:用MAE训练CNN

论文名称&#xff1a;ConvNeXt V2: Co-designing and Scaling ConvNets with Masked Autoencoders 发表时间&#xff1a;CVPR2023 code链接&#xff1a;代码 作者及组织: Sanghyun Woo&#xff0c;Shoubhik Debnath来自KAIST和Meta AI。 前言 ConvNextV2是借助MAE的思想来训练…

开学季大路灯哪个牌子质量好?实测力荐5大台灯宝藏品牌

大家或许对大路灯这一备受瞩目的电器产品耳熟能详。市场上涌现了许多品牌的大路灯&#xff0c;它们在价格、功能、容量和外观等各个方面都各具特色。有的为了追求市场占有率&#xff0c;产品质量不过关&#xff0c;使用时会出现光线频闪&#xff0c;或是光线不均&#xff0c;甚…

【element+vue】点击加号增加一行,点击减号删除一行

代码实现&#xff1a; 页面部分&#xff1a; vueelement 备注&#xff1a;v-if “i>0” &#xff08;保证第一行不出现减号&#xff09; <div v-for"(item,i) in studentList"><el-form-item label"学生:" prop"name"><el-i…