要让一个类在哈希表或字典中工作,您需要实现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 个字节长,我可能会将其设为不可变结构。