C# 学习笔记 09:无限背包与魔法图鉴 —— 集合 (List & Dictionary)
开篇:皮皮的“爆仓”事故
皮皮(Pipi)最近遭遇了人生滑铁卢。
他用数组 Item[] 做了一个背包,容量写死为 10 格。 结果今天欧气爆发,捡到了第 11 把神器—— 💥 程序当场去世IndexOutOfRangeException
皮皮:“这个背包也太死板了吧?我难道还得提前预言自己今天能捡多少装备?”
瓜瓜(淡定):“你这是用木箱子装战利品。真正的冒险者,用的是——会自己变大的魔法背包:List<T> 。”
第一关:无限扩容的魔法背包(List<T>)
List,你可以把它理解为数组的究极进化形态。
就像一条贪吃蛇: 你喂它一个数据,它就长一节。
但在使用前,瓜瓜指着背包名字后面的尖括号 < > 严肃地说:
“这个不是装饰,这是‘泛型(Generic)’,是背包的【物品分类标签】。”
为什么一定要有 <T>?(泛型的意义)
远古时代(.NET 2.0 之前)有一种背包叫 ArrayList:
什么都能往里扔。
等你伸手去拿“苹果”的时候—— 💥 摸到一个炸弹(类型转换异常)
而 List<T> 强制你贴标签:
📌 好处只有一个字:稳
👉 错误在“编译期”就被扼杀,而不是上线后炸服
List 的核心操作:增 / 删 / 查
// 1. 创建一个“只装字符串”的背包List<string> backpack = new List<string>();// 2. 捡装备(Add)—— 自动扩容!backpack.Add("屠龙刀");backpack.Add("回复药");// backpack.Add(100); // ❌ 编译报错:类型不匹配// 3. 丢垃圾(Remove)backpack.Remove("回复药");// 4. 数量统计(注意:不是 Length)Console.WriteLine($"背包里有 {backpack.Count} 件物品");// 5. 索引访问(和数组一样)Console.WriteLine($"主手武器:{backpack[0]}");
瓜瓜总结:
- 非常适合:背包、队列、排行榜

第二关:瞬间查找的魔法图鉴(Dictionary<K, V>)
皮皮的背包越来越大了。
现在有 1000 件装备,他只想找一把叫"Excalibur" 的剑。
如果还用 List? 那就只能——从头翻到尾。
瓜瓜掏出一本厚厚的书:
“既然你知道名字,为什么不用——字典?”
Dictionary 是什么?
Dictionary 存的是 键值对(Key - Value):
就像查字典:
不翻整本书,只查目录,瞬间定位
基本用法:记录 & 查找
// 创建一本图鉴:通过名字(string)查描述(string)Dictionary<string, string> guide = new Dictionary<string, string>();// 添加记录(Key 必须唯一)guide.Add("Excalibur", "传说中的誓约胜利之剑");guide.Add("Potion", "回复 50 点 HP");// 通过 Key 直接查 Value(O(1) 级别)Console.WriteLine(guide["Excalibur"]);// 修改内容guide["Potion"] = "回复 100 点 HP(强化版)";
Dictionary 的经典坑
如果你查一个不存在的 Key:
guide["不存在的物品"];
程序直接崩溃
✅ 正确姿势:
if (guide.ContainsKey("阿姆斯特朗炮")){ Console.WriteLine(guide["阿姆斯特朗炮"]);}else{ Console.WriteLine("查无此物!");}
经验法则:
- 不确定 Key 是否存在 → 先 ContainsKey
- 或者后续学习
TryGetValue
第三关:遍历集合(foreach)
不管是背包还是图鉴, 最终都逃不开一件事:全部展示出来
遍历 List
foreach (string item in backpack){ Console.WriteLine($"背包里有:{item}");}
遍历 Dictionary
字典里每一项是 KeyValuePair<TKey, TValue>(放心,var 会帮你搞定)
foreach (var entry in guide){ Console.WriteLine($"物品:{entry.Key},描述:{entry.Value}");}
总结:什么时候用谁?
** 今日战利品总览**
| | | |
|---|
List<T> | | <装什么> | |
Dictionary<K,V> | | <怎么找, 存什么> | |
课后思考(面试级)
List<T> 如果已经有 100 万条数据, 你在中间插入一个新元素,会发生什么?
提示: 就像 100 万人排好队,你硬插中间,后面的人是不是都要往后挪?
下期预告
皮皮望着满地装备陷入沉思:
“我想找出 攻击力 > 100 的武器, 再按名字排序,这难道要写三层 for 循环?”
瓜瓜微微一笑:
“欢迎学习 C# 最强的数据查询魔法 —— LINQ。”