我创建了一个类 State。对于 State 对象的队列,我想测试队列是否已包含相同值的 State 对象。当数组的所有值都相等且顺序相同时,两个 State 对象(每个都包含一个 2D 布尔数组)相等。
这是我的相关代码:
public class State {
Boolean[,] grid = new Boolean[4,4];
Public State(Boolean[,] passedGrid){ //Constructor
grid = Array.Copy(passedGrid, grid, 16);
}
public bool Equals(State s2){ //Overloaded equals operator
for (int x = 0; x < 4; x++){
for (int y = 0; y < 4; y++){
if (grid[x, y] != s2.grid[x, y]){
return false;
}
}
}
return true;
}
}
public void testContains(Boolean[] testArray) {
Queue<State> testQueue = new Queue<State>();
State s1 = new State(testArray);
State s2 = new State(testArray);
testQueue.Enqueue(s1);
Boolean b = testQueue.Contains(s2);
}
不幸的是,当调用 testContains() 并在最后检查 testQueue.Contains(s2) 的值时,它仍然说测试为 false,即使它们具有相同的数组值并且重载了 Equals 运算符来测试该值。我需要做什么或更改什么才能让 Queue.Contains 与我的对象一起使用?我在某处读到,每当 Equals 重载时,建议重载 getHashCode() 。在这种情况下我需要这样做吗?如果是这样,重载的 getHashCode() 应该做什么?
要覆盖 Equals,您需要使用
object
作为参数类型和关键字 override
。
所以你可以尝试类似的事情
public override bool Equals(object obj)
{
return Equals(obj as State);
}
public bool Equals(State s2)
{ //Overloaded equals operator
for (int x = 0; x < 4; x++)
{
for (int y = 0; y < 4; y++)
{
if (grid[x, y] != s2.grid[x, y])
{
return false;
}
}
}
return true;
}
您可能还应该包括
null
的测试
你应该
override
等于。
public override bool Equals(object s2)
{
//implementation
}
为了更好的实践,您应该实现一些其他接口,例如:
IEquatable
IEqualtable<State>
和方法GetHashCode
。覆盖 Equals
方法和 Equals
IEquatable
中的 IEqualtable<T>
方法可以共享公共私有 Equals
方法。
您缺少覆盖关键字
public override bool Equals(Object obj) {
// fill in the body
}
您只需要重写类上定义的虚拟方法
Object
:
public override Equals(object other)
{
if(other is State)
return Equals((State)other);
return base.Equals(other);
}
您需要使用此泛型重载,因为此方法由
Contains
方法使用,并且仅添加同名的实例方法是不够的。
请找到以下适合您的代码:
public class State : Object {
Boolean[,] grid = new Boolean[4,4];
public State(Boolean[,] passedGrid){ //Constructor
Array.Copy(passedGrid, grid, 16);
}
public override bool Equals(Object s2){ //Overloaded equals operator
for (int x = 0; x < 4; x++){
for (int y = 0; y < 4; y++){
if (grid[x, y] != ((State)s2).grid[x, y]){
return false;
}
}
}
return true;
}
}
class Program
{
Boolean[,] testArray = new Boolean[4, 4];
public static void Main()
{
Program p = new Program();
p.testContains(p.testArray);
}
public void testContains(Boolean[,] testArray)
{
Queue<State> testQueue = new Queue<State>();
State s1 = new State(testArray);
State s2 = new State(testArray);
testQueue.Enqueue(s1);
Boolean b = testQueue.Contains(s2);
//b is true here
}
}
}
此外,请查看以下链接以获取覆盖 Equals 方法的指南:
http://msdn.microsoft.com/en-us/library/ms173147(v=vs.80).aspx
对于定义自定义相等关系的类类型,应应用以下内容:
关于您的特定类,我建议,由于只有 65,536 个可能的不同实例,您应该简单地存储一个
Integer
来标识使用哪种位组合,在 Equals
中进行比较,然后将其返回 GetHashCode
。