Dictionary<TKey, TValue> 是 C# 中最常用的鍵值對集合。正確且高效地遍歷它,是每位開發者的基本功。本文將示範最標準的 foreach 寫法,並補充 Keys、Values、LINQ 等進階用法,幫助你根據場景選擇最適合的方式。
var dict = new Dictionary<string, int>
{
{ "張三", 1 },
{ "李四", 2 },
{ "王五", 3 },
{ "趙六", 4 },
{ "田七", 5 }
};
foreach (KeyValuePair<string, int> kvp in dict)
{
Console.WriteLine($"Key: {kvp.Key}\tValue: {kvp.Value}");
}
這是最通用、可讀性最高的寫法,同時取得鍵與值,避免重複查找。
// 僅遍歷鍵
foreach (string key in dict.Keys)
Console.WriteLine(key);
// 僅遍歷值
foreach (int value in dict.Values)
Console.WriteLine(value);
Keys 與 Values 回傳的是視圖集合,不會複製資料,效能極佳。
foreach (var (key, value) in dict)
Console.WriteLine($"{key} -> {value}");
利用元組解構,程式碼更乾淨,編譯器會自動轉換為 KeyValuePair 存取。
// 查詢語法
var query = from kvp in dict
where kvp.Value > 2
select kvp;
foreach (var kvp in query)
Console.WriteLine($"{kvp.Key} = {kvp.Value}");
// 方法語法
dict.Where(kvp => kvp.Value % 2 == 0)
.ToList()
.ForEach(kvp => Console.WriteLine($"{kvp.Key} = {kvp.Value}"));
適合需要篩選、排序、投影等複雜查詢的場景。
Parallel.ForEach(dict, kvp =>
{
// 執行耗時運算,自動利用多核心
Console.WriteLine($"Thread {Thread.CurrentThread.ManagedThreadId}: {kvp.Key} = {kvp.Value}");
});
注意:迴圈內不可修改字典結構(增刪鍵),否則會拋出例外;若需修改,請先蒐集鍵清單再處理。
foreach 中 Add/Remove 會導致 InvalidOperationException。解法:先 var keys = dict.Keys.ToList(); 再遍歷 keys 操作原字典。dict[key] 存取不存在鍵會拋 KeyNotFoundException,建議改用 TryGetValue 或 GetValueOrDefault。dict[key].SomeProperty = ... 對結構體無效,需先取出、修改、再指派回字典。
日常開發首選 foreach + 解構語法;需篩選用 LINQ;高效能批次處理考慮 Parallel.ForEach;切記遍歷時不可直接修改字典結構。掌握這幾種模式,應對所有 Dictionary 遍歷場景綽綽有餘。