字典是否可以将数组作为键?

面对字典中的问题。 数组是否可以成为价值的关键???

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. 

为什么例外?

默认情况下,只会比较数组的引用,因此您必须这样做

  1. 提供自定义IEqualityComparer
  2. 使用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函数不比较内容而是比较数组本身的引用。