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.
为何选择例外?
答案 0 :(得分:7)
默认情况下,只会比较数组的引用,因此您必须
IEqualityComparer<string[]>
或Tuple<string, string>
作为密钥(因为您只有两个字符串) 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函数不比较内容而是比较数组本身的引用。