一、字典核心概念(必背)
Dictionary 是键值对集合(Key-Value)
1. Key 键
-
唯一、不重复
-
类似数组下标,但可以是任意数据类型(int、string等)
2. Value 值
-
可以重复、可以是任意类型
-
通过 Key 唯一查找对应的 Value
3. 字典定义语法
cs
Dictionary<键类型, 值类型> 变量名 = new Dictionary<键类型, 值类型>();
二、基础增删改查
1. 创建字典 & 添加数据
cs
Dictionary<int, string> dic = new Dictionary<int, string>();
// Add(键, 值) 添加键值对
dic.Add(0, "何润东");
dic.Add(1, "周传雄-情歌教父");
2. 根据键取值
cs
Console.WriteLine(dic[0]); // 通过Key获取对应Value
3. 删除数据
cs
dic.Remove(0); // 根据Key删除整组键值对
// dic.Clear(); // 清空所有数据
4. 获取数量
cs
Console.WriteLine(dic.Count); // 获取当前键值对总数
5. 判断是否包含某个键
cs
Console.WriteLine(dic.ContainsKey(0));
// 存在返回true,不存在返回false
三、字典三大遍历方式(最全)
1. 只遍历所有 Key
cs
foreach (var item in dic.Keys)
{
Console.WriteLine(item); //输出键
Console.WriteLine(dic[item]); //通过键取值
}
2. 只遍历所有 Value
cs
foreach (var item in dic.Values)
{
Console.WriteLine(item);
}
3. 遍历整组键值对(最常用)
cs
foreach (var item in dic)
{
Console.WriteLine(item.Key + ":" + item.Value);
}
四、字典超级易错点(必考坑点)
1. Keys / Values 不能通过下标访问
错误写法:
cs
// dic.Values[0] 报错!不支持索引访问
正确写法:转数组后才能下标访问
cs
dic[键]; // 合法
2. 字典本身可以通过 Key 取值
cs
dic[键]; // 合法
3. Key 唯一,不能重复添加
重复 Add 相同 Key → 直接报错
五、高阶用法:字典存储数组(项目常用)
键:班级名 、值:班级所有学员数组
cs
Dictionary<string, string[]> dic1 = new Dictionary<string, string[]>()
{
{"一班", new string[] { "马化腾", "马云", "马斯克" }},
{"二班", new string[] { "焦恩俊", "严屹宽", "霍建华", "乔振宇" } }
};
// 根据班级Key取出整个学生数组
string[] arr = dic1["一班"];
Console.WriteLine(string.Join("-", arr));
场景:一对多数据、分类数据、分组数据首选字典存储。
六、字典核心属性总结
-
dic.Keys:获取全部键集合
-
dic.Values:获取全部值集合
-
dic.Count:获取键值对个数
-
dic.ContainsKey(key):判断键是否存在
七、终极背诵总结
-
字典是 Key-Value 键值对结构,Key 唯一,Value可重复
-
数组下标只能 int,字典 Key 可以是任意类型
-
增:Add、删:Remove/Clear、查:Keys/Values/ContainsKey
-
Keys、Values 不能直接下标访问,需要 ToArray()
-
字典可以存储数组、集合,实现分组一对多存储
八、Dictionary字典 / List<T>泛型集合 / ArrayList动态集合 终极区别
三者都是C#常用动态集合,核心差异:存储结构、寻址方式、类型安全、性能、使用场景完全不同
1. 核心结构区别
-
ArrayList:非泛型动态数组,纯顺序存储,无固定类型,全部存 object
-
List<T>:泛型动态数组,顺序存储,固定单一类型,替代ArrayList
-
Dictionary<K,V>:键值对哈希存储,通过唯一Key映射取值,无序分组存储
2. 全方位对比表(背诵版)
| 对比维度 | ArrayList | List<T> | Dictionary<K,V> |
|---|---|---|---|
| 类型安全 | 不安全,任意object混合存储 | 安全,固定泛型单一类型 | 安全,键值类型均固定 |
| 装箱拆箱 | 有,值类型频繁转换,性能低 | 无,性能极高 | 无,泛型约束,性能高 |
| 取值方式 | 下标索引取值 index | 下标索引取值 index | 唯一Key取值 key |
| 元素特点 | 元素可重复、有序 | 元素可重复、有序 | Key唯一不可重复,Value可重复 |
| 扩容机制 | 动态扩容,效率差 | 动态扩容,效率优 | 哈希寻址,无需顺序扩容 |
| 适用场景 | 老旧项目,现已淘汰 | 普通列表、有序数据、批量遍历、排序筛选 | 分类分组、一对多数据、按键快速查询 |
3. 核心优缺点总结
ArrayList 优缺点
-
优点:动态长度,无需固定数组大小
-
缺点:类型不安全、频繁装箱拆箱、性能差、项目弃用
List<T> 优缺点(项目首选列表)
-
优点:类型安全、无装箱拆箱、支持LINQ高阶操作、有序可排序、遍历高效
-
缺点:查找指定数据需要遍历,查询速度慢于字典
Dictionary 优缺点(项目首选分组)
-
优点:Key唯一索引,根据键查询速度极快,适合分组、映射、一对多数据
-
缺点:无序集合、不适合排序、单纯列表存储不如List简洁
4. 终极选型口诀(必背)
-
单纯存一堆数据、要排序、要遍历 → 用 List<T>
-
需要分类、分组、按键快速查找、一对多数据 → 用 Dictionary
-
永远不要用 ArrayList,被List<T>完全替代
5. 最简区分一句话
-
List:靠下标找数据(顺序列表)
-
Dictionary:靠Key找数据(映射分组)
-
ArrayList:List的老旧废版