第 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根本不需要下標

現在就練