C#Dictionary字典

一、字典核心概念(必背)

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):判断键是否存在


七、终极背诵总结

  1. 字典是 Key-Value 键值对结构,Key 唯一,Value可重复

  2. 数组下标只能 int,字典 Key 可以是任意类型

  3. 增:Add、删:Remove/Clear、查:Keys/Values/ContainsKey

  4. Keys、Values 不能直接下标访问,需要 ToArray()

  5. 字典可以存储数组、集合,实现分组一对多存储

八、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的老旧废版

相关推荐
Lucky_ldy4 小时前
数据结构从入门到精通:顺序表
数据结构·链表
熬夜敲代码的猫4 小时前
AVL树(C++详解版)
数据结构·c++·算法
并不喜欢吃鱼5 小时前
从零开始 C++-----十一【C++ 数据结构】红黑树全解析:从定义到工程实现(一文搞定,十分详细)
开发语言·数据结构·c++
星恒随风5 小时前
C语言数据结构排序算法详解(上):从插入排序、希尔排序到选择排序、堆排序
c语言·数据结构·笔记·学习·排序算法
迈巴赫车主5 小时前
蓝桥杯21247弹跳鞋java
java·开发语言·数据结构·算法·职场和发展·蓝桥杯
Cthy_hy5 小时前
Python算法竞赛:集合去重+字典映射 核心用法一站式整理
数据结构·python·算法
happymaker06265 小时前
LeetCodeHot100——盛水最多的容器
数据结构·算法·leetcode·双指针·hot100
过期动态6 小时前
【LeetCode 热题 100】三数之和
java·数据结构·算法·leetcode·职场和发展·排序算法
一切皆是因缘际会6 小时前
AI高速迭代下的技术风险与理性突围
大数据·数据结构·人工智能·架构