对于一类在哈希表或字典的工作,你需要实现GetHashCode()
!我不知道为什么它在HashSet中工作。我想这只是运气。
请注意,使用可变字段计算Equals或GetHashCode()是危险的。为什么?试想一下:
var x = new Int16_2D { a = 1, b = 2 };
var set = new HashSet<Int16_2D> { x };
var y = new Int16_2D { a = 1, b = 2 };
Console.WriteLine(set.Contains(y)); // True
x.a = 3;
Console.WriteLine(set.Contains(y)); // False
Console.WriteLine(set.Contains(x)); // Also false!
换句话说,当你设置x.a = 3;
你改变x的散列码。但是x在哈希表中的位置是基于它的旧的哈希码,所以x现在基本上丢失了。另请参见http://ideone.com/QQw08
此外,由于svick笔记,实施Equals
不实施==
。如果不执行==
,该==
运营商将提供一个参考比较,所以:
var x = new Int16_2d { a = 1, b = 2 };
var y = new Int16_2d { a = 1, b = 2 };
Console.WriteLine(x.Equals(y)); //True
Console.WriteLine(x == y); //False
总之,你最好使之成为一个不可改变的类型;因为它只有4个字节长,我可能会使它成为一个不可变的结构体。
http://stackoverflow.com/questions/371328/why-is-it-important-to-override-gethashcode-when-equals-method-is-overriden-in-c – 2012-04-14 16:31:13
请注意,你并不是真的实现'==','Equals()'是不同的。 – svick 2012-04-14 16:33:02