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

时间:2014-03-11 08:44:11

标签: c# dictionary

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

Dictionary<string[], int> di = new Dictionary<string[], int>();
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.

为何选择例外?

3 个答案:

答案 0 :(得分:7)

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

  1. 提供自定义IEqualityComparer<string[]>
  2. 使用Tuple<string, string>作为密钥(因为您只有两个字符串)
  3. Here's一个类似问题的答案,展示了如何为Dictionary- constructor创建自定义比较器。

答案 1 :(得分:3)

不,实际上你不应该使用数组作为Dictionary<>密钥;使用时,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() 

答案 2 :(得分:0)

因为数组的Equals和GetHashCode函数不比较内容而是比较数组本身的引用。