c#如何使用Dictionary字典_c#Dictionary字典项目实例附完整源码
C#字典默认不保证线程安全,Add方法在键重复时抛异常,应使用索引器赋值或TryAdd。TryGetValue比ContainsKey加索引器效率更高,只需一次哈希查找。自定义类作键需重写GetHashCode和Equals或使用record,且键对象不可变以避免哈希码变化导致查找失败。
DictionaryAdd 方法会直接抛出 ArgumentException,更别提如果初始化后忘了检查 ContainsKey 或者没走 TryGetValue,运行时大概率会直接崩掉。这些都不是小问题,而是日常开发中最容易翻车的地方。
为什么 Add 会报“给定键已经属于字典”?
这是最常见的误用:把 Add 当成“有就更新,无就新增”,但它的语义其实只有后者。一旦 Key 已经存在,它会毫不留情地抛出异常。那么正确的做法是什么?
- ✅ 用
dict[key] = value赋值,这种方式会自动覆盖已有值。 - ✅ 或者先检查
if (dict.ContainsKey(key)) dict[key] = value;。 - ✅ 更简洁的方案是使用
dict.TryAdd(key, value)(.NET 5+ 引入),只在 Key 不存在时写入,不会抛异常。 - ❌ 错误写法:
dict.Add("name", "Alice"); dict.Add("name", "Bob");—— 第二行必然崩溃。
TryGetValue 比 ContainsKey + 索引器 快在哪里?
这背后是个典型的性能优化点:两次哈希查找变成一次。用 ContainsKey 判断后再通过 dict[key] 取值,底层其实是两次哈希定位;而 TryGetValue 一次到位,同时返回是否存在和对应的值,效率更高,也更适合在多线程场景下配合使用。
- ✅ 推荐写法:
if (dict.TryGetValue("id123", out string name)) { Console.WriteLine(name); } - ❌ 不推荐写法:
if (dict.ContainsKey("id123")) { Console.WriteLine(dict["id123"]); // 多一次哈希计算 } - ⚠️ 需要注意:
out参数的类型必须和TValue严格匹配,比如int?和int不能混用。
如何让 Dictionary 支持自定义类作为 Key?
默认情况下,自定义类作为 Key 会按引用比较,两个内容相同但不同实例的对象会被视为不同的 Key —— 这通常不是你期望的行为。解决方案其实很明确:
- ✅ 必须重写
GetHashCode()和Equals(object obj),并且两者的逻辑要一致,例如都基于Id字段。 - ✅ 更省事的方式是让类实现
IEquatable,再配合GetHashCode的重写。 - ✅ 最推荐的做法是使用
record(C# 9+),它自动生成相等性成员,天生适合作为 Key:public record Person(string Name, int Age); var dict = new Dictionary
(); dict[new Person("Tom", 25)] = "Engineer"; - ⚠️ 还有一个容易被忽视的坑:Key 对象的字段在加入字典后被修改,会导致哈希码变化,后续
TryGetValue会找不到该 Key —— 也就是“查无此键”。
说到底,真正棘手的问题不是“怎么初始化一个 Dictionary”,而是并发场景下的静默错误、Key 生命周期管理容易被忽略、以及深嵌套结构中复用同一个字典实例导致的数据污染。这些问题不会在编译时报错,但一旦进入调试阶段,往往会让排查时间翻倍。
Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。
Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。
Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。
Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。















