商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > c#如何使用Dictionary字典_c#Dictionary字典项目实例附完整源码

c#如何使用Dictionary字典_c#Dictionary字典项目实例附完整源码

  发布于2026-07-20 阅读(0)

扫一扫,手机访问

Dictionary 在 C# 里,从来都不是“用不用”的问题,核心在于“怎么用对、怎么把坑填上”。它默认不保证线程安全,Key 重复时 Add 方法会直接抛出 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"); —— 第二行必然崩溃。

TryGetValueContainsKey + 索引器 快在哪里?

这背后是个典型的性能优化点:两次哈希查找变成一次。用 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 生命周期管理容易被忽略、以及深嵌套结构中复用同一个字典实例导致的数据污染。这些问题不会在编译时报错,但一旦进入调试阶段,往往会让排查时间翻倍。

本文转载于:https://www.php.cn/faq/2324925.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注