首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# Dictionary 入門:為何新建字典為空却能統計字元頻率?

     編輯:程式設計綜合問答

初學 C# Dictionary<TKey, TValue> 時,常見困惑:明明 new Dictionary() 是空的,為何在迴圈中直接 dic[char] 讀寫不報錯,還能正確統計頻率?本文揭示索引器的「自動新增」機制。

核心程式碼

string str = "hello world";
Dictionary<char, int> dic = new Dictionary<char, int>();  // 空字典

foreach (char c in str) {
    if (dic.ContainsKey(c)) {
        dic[c]++;          // 鍵存在:值加 1
    } else {
        dic[c] = 1;        // 鍵不存在:自動新增鍵值對,值設為 1
    }
}
// 結果:h:1, e:1, l:3, o:2, ' ':1, w:1, r:1, d:1

關鍵機制:索引器的 Get/Set 行為

操作鍵存在鍵不存在
dic[key] (get)返回對應值拋出 KeyNotFoundException
dic[key] = value (set)更新現有值自動新增鍵值對

因此 dic[c] = 1 在鍵不存在時,**不會拋出異常,而是直接把 (c, 1) 加入字典**。這就是為何「空字典」也能直接賦值的原因。

更簡潔寫法:TryGetValue

foreach (char c in str) {
    int count;
    dic.TryGetValue(c, out count);  // 不拋異常,不存在時 count=0
    dic[c] = count + 1;             // 統一賦值
}

進階:GetOrAdd (ConcurrentDictionary) / LINQ GroupBy

// LINQ 一行搞定
var freq = str.GroupBy(c => c).ToDictionary(g => g.Key, g => g.Count());

// 多執行緒安全
var cd = new ConcurrentDictionary<char, int>();
Parallel.ForEach(str, c => cd.AddOrUpdate(c, 1, (k, v) => v + 1));

常見誤區澄清

「Dictionary 只能存放預先已知的鍵」——錯誤。Dictionary 設計為動態集合,執行期可任意新增/移除鍵值對。

效能提示

  • ContainsKey + dic[key] 會查找兩次鍵;TryGetValue 僅查找一次,高頻呼叫時建議使用。
  • 預估資料量大時,建構子指定 capacity 減少擴容:new Dictionary<char,int>(1000)。
  • 鍵為實值型別(如 char, int)無裝箱開銷,效能極佳。

理解索引器「設值自動新增」特性,即能靈活運用 Dictionary 進行各類計數、分組、快取等場景。

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