一个字典能否以数组作为键?

3
我在字典方面遇到了问题。一个数组是否可以作为值的键?
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.

为什么会出现异常?


2
й—®йўҳеңЁдәҺжҜҸдёӘж•°з»„ж №жҚ®е…¶GetHashCode()иў«и§ҶдёәдёҚеҗҢпјҢеҚідҪҝе®ғ们еҢ…еҗ«зӣёеҗҢзҡ„еҖјгҖӮ - Matthew Watson
3个回答

10

因此,我需要动态创建一个包含N个键的多键字典。我尝试了简单的方法.. 你的答案给了我一种方式.. :-) - Gokul E
1
@GokulJai:我不确定你是否正确理解了我的意思。Tuple只是你的数组的另一种选择,因为你只使用了两个字符串。Tuple会自动为您覆盖Equals + GetHashCode。如果要使用数组,则需要提供一个实现IEqualityComparer<string>的自定义类,然后在字典的构造函数中使用它。 - Tim Schmelter
是的,我明白了。我的“Key”数组中可能包含一个或多个元素,但我应该使用自定义比较器。@TimSchmelter谢谢你。 - Gokul E

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() 

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接