字典是否可以将数组作为键?
面对字典中的问题。 数组是否可以成为价值的关键???
Dictionary di = new Dictionary(); di.Add(new string[] { "1","2" }, 1); di.Add(new string[] { "2","3" }, 2); MessageBox.Show(di[new string[] { "2", "3" }].ToString()); // Here KeyNotFoundException occurred.
为什么例外?
默认情况下,只会比较数组的引用,因此您必须这样做
- 提供自定义
IEqualityComparer
或 - 使用
Tuple
代替键(因为你只有两个字符串)
这是一个类似问题的答案,它显示了如何为Dictionary
– constructor创建自定义比较器。
不,实际上你不应该使用数组作为Dictionary<>
Key; 使用键时, Dictionary<>
使用其计算为地址的哈希码 :
String[] a = new[]{"1", "2"}; String[] b = new[]{"1", "2"}; a.GetHashCode() == b.GetHashCode(); // <- false
数组a和b具有不同的地址 ,因此不同的哈希码就是原因
di.Add(a, 1); di[b]; // <- error since a.GetHashCode() != b.GetHashCode()
因为数组的Equals和GetHashCode函数不比较内容而是比较数组本身的引用。