C# 泛型集合11:Dictionary 特点及应用
1. Dictionary 是什么
Dictionary<TKey, TValue> 是基于“键-值对”的泛型集合,也叫字典集合。
Dictionary<string, Teacher> teacherDic = new Dictionary<string, Teacher>();
含义:
TKey:键的类型,例如string、int。TValue:值的类型,可以是基本类型,也可以是对象。一个键对应一个值。 键不能重复,值可以重复。
使用前需要引入:
using System.Collections.Generic;
2. Dictionary 和 List 的区别
list[0] | dict["key"] | |
简单理解:
List<T>像一排按顺序编号的数据。Dictionary<TKey, TValue>像字典,通过“键”快速找到对应“值”。
3. 创建和添加元素
教师实体类:
public class Teacher
{
public int TeacherId { get; set; }
public string TeacherName { get; set; }
public int WorkingYears { get; set; }
public string Company { get; set; }
}
创建对象并添加到字典:
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<string, string> config = new Dictionary<string, string>();
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>用来保存键值对。键唯一,值可以重复。 适合根据键快速查找数据。 常用方法: Add、ContainsKey、TryGetValue、Remove、Clear。List<T>适合顺序数据,Dictionary<TKey, TValue>适合快速按键查找。