C# Dictionary<TKey, TValue>
命名空间:System.Collections.Generic
基本等同于 Java 的 HashMap<T>
构造函数
Dictionary<TKey, TValue>():默认初始容量,使用键类型的默认相等比较器。Dictionary<TKey, TValue>(IDictionary<TKey, TValue>):从某字典中复制元素,使用默认初始容量,使用键类型的默认相等比较器。Dictionary<TKey, TValue>(IDictionary<TKey, TValue>, IEqualityComparer<TKey>):从某字典中复制元素,使用默认初始容量,使用指定的相等比较器。Dictionary<TKey, TValue>(IEqualityComparer<TKey>):使用默认初始容量,使用指定的相等比较器。Dictionary<TKey, TValue>(Int32):指定初始容量,使用键类型的默认相等比较器。Dictionary<TKey, TValue>(Int32, IEqualityComparer<TKey>):指定初始容量,使用指定的相等比较器。
属性
Comparer:获取比较器对象。Count:获取键值对数目。Keys:获取键的集合。Values:获取值的集合。
方法
Add(TKey, TValue):将指定的键和值添加到字典中。Clear():移除所有键与值。ContainsKey(TKey):确定字典中是否包含指定键。ContainsValue(TValue):确定字典中是否包含指定值。Remove(TKey):从字典中移除指定的键的值。
其他
- 直接使用
[]获取或设置指定键的值。要求指定键已经存在于字典中。
注意点
在存入键值对后,不要修改存入的 Key。具体来说,不要修改 Key 后影响 HashCode 的计算。否则可能会产生异常。
Dictionary<TestClass, int> map = new Dictionary<TestClass, int>();
TestClass t1 = new TestClass() { X = 1, Y = 2 };
TestClass t2 = new TestClass() { Y = 3, X = 4 };
TestClass t3 = new TestClass() { Y = 1, X = 2 };
map.Add(t1, 1);
map.Add(t2, 2);
t1.X = 100;
// Console.WriteLine(map[t1]); // 给定关键字不在字典中
map.Add(t3, 3);
Console.WriteLine(map.Count); // 3
具体来说,在存入时,字典按照 Key 的 HashCode 将键值对(KeyValuePair<TKey, TValue>)存入指定位置。在修改 Key 导致 HashCode 更改后,字典不会对键值对存入位置作出更新,所以通过原来的 Key 对象获取元素时,无法从新的 HashCode 的位置读取到原来的键值对。
线程安全
ConcurrentDictionary<TKey,TValue>。

浙公网安备 33010602011771号