第 8 課 · 約 12 分鐘 · ← 第 7 課
集合:陣列、List、Dictionary
幾乎所有程式都是"裝一堆東西,然後對它們做點什麼"。C# 的三匹主力馬覆蓋其中 95%:陣列(定長、最快)、List<T>(可增長)、Dictionary(按鍵查詢)。
陣列:一排格子,出生時定死數量
int[] scores = new int[3]; // 恰好 3 個槽,現在決定
scores[0] = 72;
scores[1] = 95;
scores[2] = 88;
int total = 0;
for (int i = 0; i < scores.Length; i++) // 陣列用 .Length
{
total += scores[i];
}
Console.WriteLine("total: " + total + " count: " + scores.Length);
下標從 0 開始,最後一格是 Length - 1——越過去執行時就會收到 IndexOutOfRangeException。知道值時的短寫法:int[] scores = { 72, 95, 88 };
List<T>:同一排格子,按需增長
var names = new List();
names.Add("Ada");
names.Add("Grace");
names.Add("Linus");
Console.WriteLine(names.Count); // List 用 .Count,不是 .Length
names.RemoveAt(0); // 按下標刪——陣列做不到這個
Console.WriteLine(string.Join(", ", names));
<string> 是型別實參:這個列表裝字串,編譯器強制執行。Add、Remove、Contains、IndexOf、Sort、Reverse——日常工具箱。注意這裡是 .Count,陣列是 .Length;搞混了也無妨,錯誤訊息會提醒你(CS1061)。
Dictionary:沒有下標——按 KEY 查
var ages = new Dictionary(); // 鍵是 string,值是 int
ages["Ada"] = 36; // 按鍵新增或更新
ages["Grace"] = 45;
Console.WriteLine(ages["Ada"] + ages["Grace"]);
foreach (string k in ages.Keys) // 遍歷鍵
{
Console.WriteLine(k + " -> " + ages[k]);
}
if (ages.TryGetValue("Linus", out int age)) // 安全查詢
{
Console.WriteLine(age);
}
else
{
Console.WriteLine("Linus not found");
}
一個陷阱:用 ages["Linus"] 讀不存在的鍵會丟擲 KeyNotFoundException——這正是 TryGetValue 存在的原因。它是字典版的 int.TryParse:試著查,按成敗分支。
foreach 對三者通吃
int[] arr = { 72, 95, 88 };
var list = new List { 1, 2, 3 };
foreach (int x in arr) Console.Write(x + " ");
foreach (int x in list) Console.Write(x + " ");
(字典在本引擎裡需要 foreach 遍歷 .Keys/.Values——成對遍歷的 KeyValuePair 在路線圖上。)
哪個,什麼時候?
| 需求 | 用 | 為什麼 |
|---|---|---|
| 固定槽位、下標運算、效能 | T[] | 最小、最快、不可增刪 |
| "一堆東西"要增要刪 | List<T> | 現代 C# 的預設選擇 |
| 按名字/ID 查,不按位置 | Dictionary<K,V> | 按鍵即時查詢 |
| 只遍歷一次 | 任意 + foreach | 根本不需要下標 |
現在就練
- 建一個 5 個成績的
List<int>,列印平均值(double)——除的時候留意整數除法陷阱。 - 建字典:3 個使用者名稱對分數;全部列印,再安全地查一個不存在的。
- 下一課:第 9 課 — 異常。