×

C# 泛型集合[11]:Dictionary 特点及应用

独孤求败 独孤求败 发表于2026-06-22 10:50:10 浏览36 评论0

抢沙发发表评论

C# 泛型集合11:Dictionary 特点及应用

1. Dictionary 是什么

Dictionary<TKey, TValue> 是基于“键-值对”的泛型集合,也叫字典集合。

Dictionary<string, Teacher> teacherDic = new Dictionary<string, Teacher>();

含义:

  • TKey:键的类型,例如 stringint
  • TValue:值的类型,可以是基本类型,也可以是对象。
  • 一个键对应一个值。
  • 键不能重复,值可以重复。

使用前需要引入:

using System.Collections.Generic;

2. Dictionary 和 List 的区别

对比点
List
Dictionary<TKey, TValue>
存储方式
按索引存储
按键值对存储
访问方式
list[0]dict["key"]
适合场景
按顺序保存一组数据
根据唯一键快速查找数据
键是否唯一
没有键
键必须唯一

简单理解:

  • List<T> 像一排按顺序编号的数据。
  • Dictionary<TKey, TValue> 像字典,通过“键”快速找到对应“值”。

3. 创建和添加元素

教师实体类:

public class Teacher
{
    public int TeacherId { getset; }
    public string TeacherName { getset; }
    public int WorkingYears { getset; }
    public string Company { getset; }
}

创建对象并添加到字典:

Teacher teacher1 = new Teacher { TeacherId = 11, TeacherName = "小玲", Company = "红星小学" };
Teacher teacher2 = new Teacher { TeacherId = 12, TeacherName = "小灵", Company = "红星小学" };

Dictionary<string, Teacher> teacherDic = new Dictionary<string, Teacher>();
teacherDic.Add("小玲", teacher1);
teacherDic.Add("小玲", teacher2);

说明:

  • "小玲" 是键。
  • teacher1 是值。
  • 通过键可以快速找到对应的教师对象。

4. 集合初始化器

可以在创建字典时直接初始化数据。

Dictionary<string, Teacher> teacherDic = new Dictionary<string, Teacher>()
{
    ["小玲"] = teacher1,
    ["小灵"] = teacher2
};

也常见这种写法:

Dictionary<string, Teacher> teacherDic = new Dictionary<string, Teacher>()
{
    { "小玲", teacher1 },
    { "小灵", teacher2 }
};

5. 根据键获取值

Teacher teacher = teacherDic["小灵"];
Console.WriteLine(teacher.Company);

也可以直接访问对象属性:

Console.WriteLine(teacherDic["小灵"].Company);

注意:如果键不存在,直接使用 teacherDic["不存在"] 会报错。

6. 判断键是否存在

使用 ContainsKey 判断键是否存在。

bool exists = teacherDic.ContainsKey("小灵");

安全取值:

if (teacherDic.ContainsKey("小灵"))
{
    Teacher teacher = teacherDic["小灵"];
    Console.WriteLine(teacher.TeacherName);
}

实际开发中更推荐 TryGetValue

if (teacherDic.TryGetValue("小灵"out Teacher teacher))
{
    Console.WriteLine(teacher.Company);
}

优点:一次完成判断和取值,避免重复查找。

7. 遍历 Dictionary

遍历所有键

foreach (string key in teacherDic.Keys)
{
    Console.WriteLine(key);
}

遍历所有值

foreach (Teacher teacher in teacherDic.Values)
{
    Console.WriteLine($"{teacher.TeacherId}\t{teacher.TeacherName}\t{teacher.Company}");
}

同时遍历键和值

foreach (KeyValuePair<string, Teacher> item in teacherDic)
{
    Console.WriteLine($"{item.Key}\t{item.Value.TeacherName}\t{item.Value.Company}");
}

8. 常用属性和方法

Count 获取键值对数量

int count = teacherDic.Count;

Remove 根据键删除

teacherDic.Remove("小灵");

Clear 清空字典

teacherDic.Clear();

ContainsValue 判断是否包含某个值

bool hasTeacher = teacherDic.ContainsValue(teacher1);

注意:对象类型的 ContainsValue 默认比较对象引用,不一定按属性内容比较。

9. Add 和索引器赋值的区别

Add 添加重复键会报错:

teacherDic.Add("小玲", teacher1);
// teacherDic.Add("小玲", teacher2); // 错误:键重复

索引器赋值可以新增,也可以覆盖已有键的值:

teacherDic["小玲"] = teacher1; // 不存在则新增
teacherDic["小玲"] = teacher2; // 已存在则覆盖

如果不希望误覆盖,先用 ContainsKey 或 TryAdd 判断。

10. 键类型选择建议

常用键类型:

  • string:姓名、编码、配置项名称。
  • int:ID、编号。
  • enum:状态、类型。

不建议随便用普通对象作为键。对象作为键时,需要正确处理相等比较和哈希规则,否则查找结果可能不符合预期。

好的键应具备:

  • 唯一。
  • 稳定,不应频繁变化。
  • 容易比较。

11. 实际开发常见场景

根据 ID 查询对象

Dictionary<int, Teacher> teachers = new Dictionary<int, Teacher>();
teachers.Add(11, teacher1);

Teacher teacher = teachers[11];

保存配置

Dictionary<stringstring> config = new Dictionary<stringstring>();
config["IP"] = "192.168.1.10";
config["Port"] = "502";

防止重复添加

if (!teacherDic.ContainsKey("小玲"))
{
    teacherDic.Add("小玲", teacher1);
}

12. 易错点

  • Dictionary<TKey, TValue> 必须指定键类型和值类型。
  • 键不能重复,重复 Add 会报错。
  • 直接用不存在的键取值会报错。
  • 遍历字典时,不要依赖固定顺序。
  • Count 表示键值对数量。
  • 删除元素用 Remove(key),不是按索引删除。
  • 键应尽量选择稳定、唯一的值。

13. 小结

  • Dictionary<TKey, TValue> 用来保存键值对。
  • 键唯一,值可以重复。
  • 适合根据键快速查找数据。
  • 常用方法:AddContainsKeyTryGetValueRemoveClear
  • List<T> 适合顺序数据,Dictionary<TKey, TValue> 适合快速按键查找。


群贤毕至

访客