一、字典核心概念(必考)
1. 什么是字典
字典是键值对(Key-Value)集合。
-
Key(键):唯一、不可重复,类比数组下标
-
数组下标:只能是 int 类型
-
字典 Key:可以是任意类型(int、string、枚举等)
-
-
Value(值):根据键存储、读取的数据,可以重复
2. 字典最大优势
通过唯一键精准取值,查询速度远超数组、List。
二、字典定义语法
1. 空字典创建
// Key:int Value:string
Dictionary<int,string> dic = new Dictionary<int,string>();
2. 初始化带数据
Dictionary<int, string> dic = new Dictionary<int, string>()
{
{0, "何润东"},
{1, "周传雄"}
};
三、字典全套常用 API(你代码全覆盖)
1. 添加键值对 Add()
dic.Add(0, "何润东");
dic.Add(1, "周传雄-情歌教父");
注意:添加重复 Key 直接报错,键唯一不可重复。
2. 通过键取值
Console.WriteLine(dic[0]);
3. 获取全部键 / 全部值
dic.Keys; // 获取所有键集合
dic.Values; // 获取所有值集合
开发规范:一般直接使用,不用单独定义变量接收。
4. 删除 Remove()
dic.Remove(0); // 根据键删除整组键值对
5. 统计个数 Count
Console.WriteLine(dic.Count);
字典没有 Length,只有 Count(和集合统一)。
6. 判断是否包含指定键
dic.ContainsKey(0); // 返回 true/false
高频用途:防止键不存在取值报错。
7. 清空字典 Clear()
dic.Clear(); // 清空所有键值对
四、字典三种遍历方式(必考默写)
1. 只遍历所有 Key
foreach (var item in dic.Keys)
{
Console.WriteLine(item);
//Console.WriteLine(dic[item]); // 可根据key拿值
}
2. 只遍历所有 Value
foreach (var item in dic.Values)
{
Console.WriteLine(item);
}
3. 遍历完整键值对(最常用)
foreach (var item in dic)
{
Console.WriteLine(item.Key + ":" + item.Value);
}
五、字典超级易错点(必考坑点)
1. 字典不能通过下标索引遍历
dic.Valuesi、dic.Keysi 不支持!报错
Keys、Values 是集合,不是数组,不支持索引访问
如果必须下标访问:需要先 ToArray()
// 正确写法
dic.Values.ToArray()[0];
2. Key 唯一,Value 可重复
-
相同 Key 重复添加 → 程序崩溃
-
不同 Key 可以存一模一样的 Value
3. 键不存在直接取值会崩溃
dic999:如果999不存在 → 直接报错
安全写法:先判断 ContainsKey 再取值
六、高阶案例:字典存储数组(考试压轴)
需求:Key=班级名,Value=班级学员数组
Dictionary<string, string[]> dic1 = new Dictionary<string, string[]>()
{
{"一班", new string[]{ "马化腾","马云","马斯克"} },
{"二班", new string[]{ "焦恩俊","严屹宽","霍建华","乔振宇"} }
};
// 根据班级key取出整个数组
string[] arr = dic1["一班"];
Console.WriteLine(string.Join("-",arr));
亮点:字典可以嵌套任意类型(数组、集合、对象),非常适合分类存储数据。
七、考前速记口诀
-
字典存储键值对,键唯值多不冲突
-
键可任意类型用,数组下标只能数
-
Keys取键Values取值,整体遍历拿KeyValue
-
无Length只有Count,不能下标直接取
-
重复键添加报错,取值先判是否存在
数组、List、Dictionary 三者终极对比
一、三大容器核心定位(一句话区分)
-
数组 Array :固定长度、纯顺序存储、性能最高,适合数据固定不变
-
List<T> 泛型集合 :动态顺序存储、增删灵活、类型安全,适合一组有序数据
-
Dictionary 字典集合 :键值对存储、根据Key精准查找,适合分类映射、对应关系数据
二、终极最全对比总表(默写满分)
| 对比维度 | 数组 Array | List<T> | Dictionary<K,V> |
|---|---|---|---|
| 存储结构 | 纯顺序结构(下标索引) | 顺序线性结构 | 键值对映射结构(Key-Value) |
| 长度特点 | 固定长度,不可扩容 | 动态长度,自动扩容 | 动态长度,自动扩容 |
| 索引方式 | 只能 int 数值下标 | 只能 int 数值下标 | 自定义Key类型(int、string均可) |
| 元素唯一性 | 元素可重复 | 元素可重复 | Key唯一不可重复,Value可重复 |
| 获取数量 | Length | Count | Count |
| 查询方式 | 遍历查找、速度慢 | 遍历/高阶方法查找 | 根据Key直接精准取值,速度最快 |
| 增删性能 | 极差(无法直接增删) | 优秀 | 极优 |
| 遍历方式 | for / foreach | for / foreach / ForEach | 只能 foreach(不支持for下标遍历) |
| 数据关系 | 纯单列数据 | 纯单列数据 | 一一对应关系数据 |
| 典型场景 | 固定数据、常量数据 | 列表数据、有序数据集合 | 分类数据、映射关系、ID对应名称 |
三、考试高频易错区别(必背坑点)
1. 下标本质区别
-
数组、List:下标是系统自动生成的 int 数字索引,不可自定义
-
字典:索引是 自己定义的Key,类型自由、语义清晰
2. 遍历最大区别
-
数组、List:支持 for 下标遍历 + foreach 遍历
-
字典:不支持 for 下标遍历,只能 foreach
-
字典 Keys、Values 不能直接 i 取值,必须 ToArray() 转换
3. 重复机制区别
-
数组、List:允许大量重复元素
-
字典:Key 绝对唯一,重复添加直接报错
4. 查询效率区别
-
数组、List:数据越多,查找越慢(逐个遍历)
-
字典:哈希寻址,数据再多查找速度几乎不变
四、场景选型标准(做题/开发万能公式)
-
数据固定、不会增减 → 用数组
-
数据频繁增删、有序列表数据 → 用 List<T>
-
数据有对应关系、需要根据条件精准匹配 → 用 Dictionary
五、简答题满分标准答案
问:字典和 List 的区别?
-
List 是顺序集合,依靠系统int下标访问;字典是键值对集合,依靠自定义Key访问。
-
List 元素可重复;字典 Key 唯一、Value 可重复。
-
List 适合存储单列有序数据;字典适合存储一一对应的映射关系数据。
-
List 支持for下标遍历;字典不支持下标遍历,查询效率字典更高。