You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# Dictionary中ContainsKey与ContainsValue的区别是什么?

C# Dictionary中ContainsKey与ContainsValue的区别及代码示例解析

嘿,这个问题问得很实在!我来给你把这俩方法的差异讲得明明白白,再结合你给的代码示例拆解清楚。

核心区别:原理、性能与检查目标

这俩方法本质上就是为了不同的检查场景设计的,核心差异体现在这几点:

  • ContainsKey:针对键的高效查找
    Dictionary本身是基于哈希表实现的,所有的键都会被构建哈希索引,所以ContainsKey查找时直接通过哈希定位,时间复杂度是O(1)——不管字典里有多少数据,基本都是瞬间出结果。它的作用是检查字典的键集合中是否存在指定的键。
  • ContainsValue:针对值的遍历查找
    字典里的值没有对应的哈希索引,所以ContainsValue必须遍历字典里的每一个键值对,逐个比对值是否匹配,时间复杂度是O(n)——数据量越大,查找速度越慢。它的作用是检查字典的值集合中是否存在指定的值。

你的代码示例里的具体差异

看你这段代码:

public Dictionary<string, string> dictionary = new Dictionary<string, string>();
if(dictionary.ContainsValue("123")) { }
if(dictionary.ContainsKey("123")) { }

这里的差异可以拆成三个维度:

  1. 检查的对象完全不同
    • ContainsValue("123"):在字典所有的值里找有没有"123",只要任意一个键对应的值是"123",就返回true,和键是什么没关系。
    • ContainsKey("123"):在字典所有的键里找有没有"123",只要存在这个键,就返回true,和对应的值是什么没关系。
  2. 性能差距巨大
    假设你的字典里有10万条数据,ContainsKey("123")几毫秒就能出结果;但ContainsValue("123")得把10万条数据全扫一遍才能确定,数据量越大,这个差距越夸张。
  3. 适用场景完全不同
    • 如果你的需求是判断某个键是否存在(比如要避免添加重复键,或者要通过键取值),那ContainsKey是唯一正确且高效的选择,这也是Dictionary设计时就优化的核心场景。
    • 如果确实需要检查某个值是否存在,那只能用ContainsValue,但如果数据量很大,建议额外维护一个HashSet<string>来存储所有值,这样查找值也能达到O(1)的效率。

举个实际例子更直观

给你的字典加两条数据:

dictionary.Add("user1", "123");
dictionary.Add("123", "admin");

这时候:

  • ContainsKey("123") → 返回true(因为键里有"123")
  • ContainsValue("123") → 返回true(因为值里有"123")

如果只加一条:

dictionary.Add("user1", "456");

这时候:

  • ContainsKey("123") → 返回false
  • ContainsValue("123") → 返回false

内容的提问来源于stack exchange,提问作者Hiraku

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:44:00