0Pricing
C# Academy · 课时

字典查找

快速访问键值。

字典查找 是 CoddyKit 上的免费 C# Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C# Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C# Academy 课程共包含 4 节课。

键值对

Dictionary<TKey, TValue> 会将唯一键映射到值。您可以把它看作查找表:提供一个键,就能快速取回对应的值。

它由哈希表支持,因此按键查找值的平均时间复杂度为 O(1),比扫描列表快得多。

using System.Collections.Generic;

var ages = new Dictionary<string, int>();
ages["Ann"] = 30;
ages["Bob"] = 25;

初始化字典

您可以使用集合初始化器为字典预填数据。每个条目都会将一个键与其值配对。

键必须唯一。在初始化器中两次提供相同的键,会在运行时抛出 ArgumentException。

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var caps = new Dictionary<string, string> {
            ["FR"] = "Paris",
            ["JP"] = "Tokyo"
        };
        Console.WriteLine(caps["JP"]);
    }
}

按键读取

请使用索引器读取:dict[key]。平均时间复杂度为 O(1)。

但请注意:如果键不存在,索引器会抛出 KeyNotFoundException。读取不存在的键是字典中最常见的错误之一。

var ages = new Dictionary<string, int> { ["Ann"] = 30 };
int a = ages["Ann"];      // 30
// int b = ages["Zoe"];   // throws KeyNotFoundException

使用 TryGetValue 安全查找

TryGetValue 可以避免异常。当键存在时,它会返回 true 并设置一个 out 变量;否则返回 false。

这是查找不确定是否存在的值时最惯用且无需分配内存的方式。

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var ages = new Dictionary<string, int> { ["Ann"] = 30 };
        if (ages.TryGetValue("Ann", out int v))
            Console.WriteLine(v);
    }
}

ContainsKey 与默认值

ContainsKey 可以在不读取值的情况下检查键是否存在,时间复杂度为 O(1)。当您只需要知道是或否时,请在使用索引器读取前调用它。

如果同时调用 ContainsKey 和索引器,就会对键进行两次哈希计算。TryGetValue 只计算一次,因此通常更快。

var ages = new Dictionary<string, int> { ["Ann"] = 30 };
if (ages.ContainsKey("Ann"))
    System.Console.WriteLine(ages["Ann"]);

添加与赋值

索引器 dict[key] = value 会插入新的键值对,或覆盖已有的键值对。Add(key, value) 只负责插入;如果键已存在,就会抛出异常。

当重复键应被视为错误时,请使用 Add;允许覆盖时,请使用索引器。

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var d = new Dictionary<string, int>();
        d["x"] = 1;
        d["x"] = 2;     // overwrite, fine
        Console.WriteLine(d["x"]);
    }
}

移除条目

Remove(key) 会删除一个键值对,并在键存在时返回 true,平均时间复杂度为 O(1)。

其中一个重载会通过 out 参数返回被删除的值;当您希望在一个步骤中删除并使用该值时,这很方便。

var d = new Dictionary<string, int> { ["a"] = 1, ["b"] = 2 };
bool removed = d.Remove("a");   // true
bool again = d.Remove("a");     // false

遍历键值对

循环会产生 KeyValuePair<TKey, TValue> 项。您可以将它们解构为键和值,使代码更加清晰。

枚举顺序不受保证;绝不要依赖条目的插入顺序。如果只想遍历一侧,请使用 Keys 或 Values。

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var d = new Dictionary<string, int> { ["a"] = 1, ["b"] = 2 };
        foreach (var (key, val) in d)
            Console.WriteLine($"{key}={val}");
    }
}

使用字典计数

一个经典用途是统计出现次数。对于每个项目,请增加它的计数;如果它是新项目,则从零开始。

对于 n 个项目,这种模式的时间复杂度为 O(n),因为每次查找和更新都是 O(1);如果每次都扫描列表,则是 O(n²)。

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var counts = new Dictionary<char, int>();
        foreach (char c in "banana")
            counts[c] = counts.GetValueOrDefault(c) + 1;
        Console.WriteLine(counts['a']);
    }
}

键的相等性很重要

查找依赖于键类型的 GetHashCode 和 Equals。内置类型和 string 都可以直接使用。

对于自定义类类型的键,请重写这两个方法(或使用 record),否则两个看起来相等的键可能产生不同的哈希值,从而导致查找失败。

var byName = new Dictionary<string, int>(
    System.StringComparer.OrdinalIgnoreCase);
byName["Hi"] = 1;
bool found = byName.ContainsKey("HI"); // true

选择值类型

值可以是任何类型,包括列表。Dictionary<string, List<int>> 可以将许多值归到同一个键下。

向这种结构中插入数据时,请在第一次使用时创建内部列表,然后向其中添加数据。这样就构建出了一个分组的多值映射。

var groups = new Dictionary<string, List<int>>();
void Add(string k, int v) {
    if (!groups.TryGetValue(k, out var list))
        groups[k] = list = new List<int>();
    list.Add(v);
}

快速检查

请选择读取可能缺失的键时最安全的方式。

回顾

Dictionary<K,V> 由哈希表支持,按键进行查找、插入和移除的平均时间复杂度均为 O(1)。

请优先使用 TryGetValue,而不是会抛出异常的索引器;保持键唯一,并确保自定义键类型实现正确的相等性和哈希处理。迭代顺序未定义。

常见问题解答

「字典查找」课时是免费的吗?

是的 — 「字典查找」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C# Academy 课程的其余内容,请升级到 CoddyKit PRO。 C# Academy 课程共包含 4 节课。

「字典查找」这节课中我会学到什么?

快速访问键值。 你通过在浏览器中直接运行的动手代码来练习 C# Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C# Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 C# Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「字典查找」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 C# Academy 课中编写并运行代码吗?

能。每节 C# Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 实践中的列表
  2. 字典查找
  3. HashSet 与唯一性
  4. 选择集合
← 返回 C# Academy