0

0

C#怎么使用字典Dictionary_C#如何根据键快速查找值【教程】

尼克

尼克

发布时间:2026-03-18 15:09:32

|

210人浏览过

|

来源于php中文网

原创

Dictionary 查找比 List 快因底层为哈希表,平均时间复杂度 O(1),而 List 需遍历、最坏 O(n);关键依赖 GetHashCode() 和 Equals() 的合理实现,推荐用 TryGetValue() 安全取值。

Dictionary 查找值为什么比 List

因为 dictionary 底层用哈希表实现,平均查找时间复杂度是 o(1);而 list<t></t> 是数组,按键查找得遍历,最坏 o(n)。但前提是键的 gethashcode()equals() 实现合理——比如用 stringint 当键基本没问题,但自定义类当键时,不重写这两个方法就会查不到。

  • 没重写 GetHashCode() 的自定义键,每次调用返回不同哈希值,导致 ContainsKey() 返回 false,哪怕键内容完全一样
  • null 可以作为键存入(如果 TKey 是引用类型),但 ContainsKey(null) 会正常工作;而 dict[null] 会抛 KeyNotFoundException
  • 值类型键(如 int)不会装箱,性能无额外开销;引用类型键要注意是否可能为 null,尤其在 .NET 6+ 启用可空引用后编译器会警告

用 TryGetValue() 而不是先 ContainsKey() 再索引访问

两次查找等于白跑一趟哈希计算。.NET 官方文档明确建议:想安全取值,直接用 TryGetValue(),它一次哈希、一次判断、一次赋值,既快又线程友好(相比 ContainsKey() + [] 的非原子操作)。

  • 错误写法:if (dict.ContainsKey(key)) value = dict[key]; —— 至少两次哈希查找
  • 正确写法:if (dict.TryGetValue(key, out var value)) { /* use value */ }
  • 如果确定键一定存在,且想省略检查,才用 dict[key];但一旦键不存在,立刻抛 KeyNotFoundException,别指望它返回默认值

初始化 Dictionary 时指定容量能减少扩容开销

默认构造的 Dictionary 初始桶数组长度是 0,第一次 Add 就扩容到 3,之后按 2 倍增长(3→7→15→31…)。频繁 Add 会导致多次 rehash,尤其数据量大时明显拖慢。

  • 已知要存 1000 个键值对,直接写 new Dictionary<string int>(1024)</string>,比默认构造快 10%~20%
  • 容量不是“最大允许数量”,而是内部哈希桶数组长度,设太大浪费内存,设太小触发多次扩容;经验上设为预估总数的 1.2~1.5 倍较稳妥
  • 如果用 Dictionary<string, string>.EmptyImmutableDictionary,那是另一回事——它们不可变,不适用此优化

KeyNotFoundException 不代表键真不存在,可能是 Equals 逻辑异常

当你确信键存在却仍抛 KeyNotFoundException,大概率是键类型的 Equals() 方法有 bug,或者哈希冲突处理出问题。比如自定义键里 GetHashCode() 基于一个字段算,Equals() 却比较另一个字段,结果哈希值相同但内容不等,查找就失败。

百灵大模型
百灵大模型

蚂蚁集团自研的多模态AI大模型系列

下载
  • 调试时打个断点,在 TryGetValue() 前手动调用 key.GetHashCode()dict.Comparer.GetHashCode(key) 看是否一致
  • dict.Keys.ToList() 拿出所有键,逐个调 key.Equals(你传的键),看哪个该返回 true 却返回 false
  • 避免在 GetHashCode() 里用可变字段(如属性 setter 可改的字段),否则插入后字段一改,哈希值变,后续再也找不到这个键

事情说清了就结束

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
PHP 高并发与性能优化
PHP 高并发与性能优化

本专题聚焦 PHP 在高并发场景下的性能优化与系统调优,内容涵盖 Nginx 与 PHP-FPM 优化、Opcode 缓存、Redis/Memcached 应用、异步任务队列、数据库优化、代码性能分析与瓶颈排查。通过实战案例(如高并发接口优化、缓存系统设计、秒杀活动实现),帮助学习者掌握 构建高性能PHP后端系统的核心能力。

115

2025.10.16

PHP 数据库操作与性能优化
PHP 数据库操作与性能优化

本专题聚焦于PHP在数据库开发中的核心应用,详细讲解PDO与MySQLi的使用方法、预处理语句、事务控制与安全防注入策略。同时深入分析SQL查询优化、索引设计、慢查询排查等性能提升手段。通过实战案例帮助开发者构建高效、安全、可扩展的PHP数据库应用系统。

99

2025.11.13

JavaScript 性能优化与前端调优
JavaScript 性能优化与前端调优

本专题系统讲解 JavaScript 性能优化的核心技术,涵盖页面加载优化、异步编程、内存管理、事件代理、代码分割、懒加载、浏览器缓存机制等。通过多个实际项目示例,帮助开发者掌握 如何通过前端调优提升网站性能,减少加载时间,提高用户体验与页面响应速度。

38

2025.12.30

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

114

2026.03.06

抖漫入口地址合集
抖漫入口地址合集

本专题整合了抖漫入口地址相关合集,阅读专题下面的文章了解更多详细地址。

3

2026.03.17

多环境下的 Nginx 安装、结构与运维实战
多环境下的 Nginx 安装、结构与运维实战

本专题聚焦多环境下Nginx实战,详解开发、测试及生产环境的差异化安装策略与目录结构规划。深入剖析配置模块化设计、灰度发布流程及跨环境同步机制。结合监控告警、故障排查与自动化运维工具,提供全链路管理方案,助力团队构建灵活、高可用的Nginx服务体系,从容应对复杂业务场景挑战。

0

2026.03.17

PS 批量添加图片
PS 批量添加图片

本专题整合了PS批量添加图片教程合集,阅读专题下面的文章了解更多详细操作。

2

2026.03.17

Nginx 基础架构:从安装配置到系统化管理
Nginx 基础架构:从安装配置到系统化管理

本专题深入解析Nginx基础架构,涵盖从源码编译与包管理安装,到核心配置文件优化及虚拟主机部署。进一步探讨日志轮转、性能调优、高可用集群构建及自动化运维策略,助力管理员实现从单一服务搭建到企业级系统化管理的全面升级,确保Web服务高效、稳定运行。

1

2026.03.17

mulerun骡子快跑入口地址汇总
mulerun骡子快跑入口地址汇总

本专题整合了mulerun入口地址合集,阅读专题下面的文章了解更多详细内容。

38

2026.03.17

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.6万人学习

C 教程
C 教程

共75课时 | 5.6万人学习

C++教程
C++教程

共115课时 | 22.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号