C# Dictionary 字典集合+数组、List、Dictionary 三者终极对比

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

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 的区别?

  1. List 是顺序集合,依靠系统int下标访问;字典是键值对集合,依靠自定义Key访问。

  2. List 元素可重复;字典 Key 唯一、Value 可重复。

  3. List 适合存储单列有序数据;字典适合存储一一对应的映射关系数据。

  4. List 支持for下标遍历;字典不支持下标遍历,查询效率字典更高。

相关推荐
醇氧1 小时前
排队论(牛吃草问题)解题全解析
算法
蓝速科技2 小时前
3D 数字人全息舱算力部署方案对比:本地 X86 独显架构与云端 RK 架构怎么选才好
数据结构·人工智能·算法·架构·排序算法
qingyulee2 小时前
集成学习、聚类算法
算法·聚类·集成学习
lqqjuly2 小时前
机器人状态估计与 SLAM—概率推理到 simultaneous Localization and Mapping
算法·机器人
sali-tec2 小时前
C# 基于OpenCv的视觉工作流-章79-单位转换
图像处理·人工智能·opencv·算法·计算机视觉
兰令水2 小时前
leecodecode【双指针题2】【2026.5.26打卡-java版本】
java·开发语言·算法
一只老丸2 小时前
HOT100题打卡第27天——动态规划(hard)
算法·动态规划
羑悻的小杀马特2 小时前
【动态规划篇】正则表达式与通配符:开启代码匹配的赛博奇幻之旅
c++·算法·leetcode·正则表达式
吴可可1232 小时前
SolidWorks二次开发实战应用
算法