首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# Dictionary 遍歷完全指南:foreach、Keys、Values 與 LINQ 多種寫法

     編輯:關於C語言

前言

Dictionary<TKey, TValue> 是 C# 中最常用的鍵值對集合。正確且高效地遍歷它,是每位開發者的基本功。本文將示範最標準的 foreach 寫法,並補充 Keys、Values、LINQ 等進階用法,幫助你根據場景選擇最適合的方式。

基礎範例:建立測試資料

var dict = new Dictionary<string, int>
{
    { "張三", 1 },
    { "李四", 2 },
    { "王五", 3 },
    { "趙六", 4 },
    { "田七", 5 }
};

方式一:標準 foreach 遍歷 KeyValuePair(推薦)

foreach (KeyValuePair<string, int> kvp in dict)
{
    Console.WriteLine($"Key: {kvp.Key}\tValue: {kvp.Value}");
}

這是最通用、可讀性最高的寫法,同時取得鍵與值,避免重複查找。

方式二:僅需鍵或值時使用 Keys / Values 集合

// 僅遍歷鍵
foreach (string key in dict.Keys)
    Console.WriteLine(key);

// 僅遍歷值
foreach (int value in dict.Values)
    Console.WriteLine(value);

Keys 與 Values 回傳的是視圖集合,不會複製資料,效能極佳。

方式三:解構語法(C# 7.0+)更簡潔

foreach (var (key, value) in dict)
    Console.WriteLine($"{key} -> {value}");

利用元組解構,程式碼更乾淨,編譯器會自動轉換為 KeyValuePair 存取。

方式四:LINQ 查詢語法與方法語法

// 查詢語法
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 多執行緒遍歷(.NET Core / .NET 5+)

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 = ... 對結構體無效,需先取出、修改、再指派回字典。

執行結果展示

Dictionary 遍歷輸出結果

總結

日常開發首選 foreach + 解構語法;需篩選用 LINQ;高效能批次處理考慮 Parallel.ForEach;切記遍歷時不可直接修改字典結構。掌握這幾種模式,應對所有 Dictionary 遍歷場景綽綽有餘。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved