初學 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
| 操作 | 鍵存在 | 鍵不存在 |
|---|---|---|
dic[key] (get) | 返回對應值 | 拋出 KeyNotFoundException |
dic[key] = value (set) | 更新現有值 | 自動新增鍵值對 |
因此 dic[c] = 1 在鍵不存在時,**不會拋出異常,而是直接把 (c, 1) 加入字典**。這就是為何「空字典」也能直接賦值的原因。
foreach (char c in str) {
int count;
dic.TryGetValue(c, out count); // 不拋異常,不存在時 count=0
dic[c] = count + 1; // 統一賦值
}
// 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 進行各類計數、分組、快取等場景。