永远不会命中 IEqualityComparer<CustomClass> 上的 Equals 实现中的断点
Breakpoint in Equals implimentation on IEqualityComparer<CustomClass> is never hit
我有一个简单的习惯class要点:
public class Point: IEqualityComparer<Point>
{
public double X;
public double Y;
public double Z;
private double[] startPointCoords;
public Point()
{
}
public Point(double[] pointArray)
{
this.startPointCoords = pointArray;
X = pointArray[0];
Y = pointArray[1];
Z = pointArray[2];
}
public bool Equals(Point x, Point y)
{
if(x.X == y.X && x.Y == y.Y && x.Z == y.Z)
{
return true;
}
return false;
}
public int GetHashCode(Point obj)
{
string xString = X.ToString().Replace(".", "");
string yString = Y.ToString().Replace(".", "");
string zString = Z.ToString().Replace(".", "");
int xInt = Convert.ToInt32(xString);
int yInt = Convert.ToInt32(yString);
int zInt = Convert.ToInt32(zString);
return xInt - yInt + zInt;
}
}
我正在字典中使用这个 class。我正在使用以下方法检查点实例是否已添加到字典中:
if (!pointsToProcess.ContainsKey(startPoint))
{
pointsToProcess.Add(startPoint, startPoint);
}
我正在调试我的代码以确保 Equals 正常工作。我在 Point.Equals 中设置的断点从未被击中。我在 Point.GetHashCode 中设置了一个断点,它也从未被击中。好像没有人用。
我知道在 .Net 中有 classes 称为 Point。我绝对确定我代码中的所有 Point 都来自我的自定义命名空间。
为什么我的Point.Equals和Point.GetHashCode在设置断点的时候不能到达?
Equals(a, b)
方法未被 IEquatable
命中,因此您需要调整它以适应界面。
试试这个:
public class Point : IEquatable<Point>
{
public double X;
public double Y;
public double Z;
private double[] startPointCoords;
public Point()
{
}
public Point(double[] pointArray)
{
this.startPointCoords = pointArray;
X = pointArray[0];
Y = pointArray[1];
Z = pointArray[2];
}
public override bool Equals(object obj) => Equals(obj as Point);
public bool Equals(Point other)
{
if (other is null)
return false;
if (ReferenceEquals(this, other))
return true;
return this.X == other.X &&
this.Y == other.Y &&
this.Z == other.Z;
}
public override int GetHashCode()
{
string xString = X.ToString().Replace(".", "");
string yString = Y.ToString().Replace(".", "");
string zString = Z.ToString().Replace(".", "");
int xInt = Convert.ToInt32(xString);
int yInt = Convert.ToInt32(yString);
int zInt = Convert.ToInt32(zString);
return xInt - yInt + zInt;
}
}
还有很多方法可以在 C# 中为自定义对象实现哈希码。虽然不完美,但一种简单的方法是使用匿名对象哈希:
public override int GetHashCode()
{
return new { X, Y, Z }.GetHashCode();
}
我有一个简单的习惯class要点:
public class Point: IEqualityComparer<Point>
{
public double X;
public double Y;
public double Z;
private double[] startPointCoords;
public Point()
{
}
public Point(double[] pointArray)
{
this.startPointCoords = pointArray;
X = pointArray[0];
Y = pointArray[1];
Z = pointArray[2];
}
public bool Equals(Point x, Point y)
{
if(x.X == y.X && x.Y == y.Y && x.Z == y.Z)
{
return true;
}
return false;
}
public int GetHashCode(Point obj)
{
string xString = X.ToString().Replace(".", "");
string yString = Y.ToString().Replace(".", "");
string zString = Z.ToString().Replace(".", "");
int xInt = Convert.ToInt32(xString);
int yInt = Convert.ToInt32(yString);
int zInt = Convert.ToInt32(zString);
return xInt - yInt + zInt;
}
}
我正在字典中使用这个 class。我正在使用以下方法检查点实例是否已添加到字典中:
if (!pointsToProcess.ContainsKey(startPoint))
{
pointsToProcess.Add(startPoint, startPoint);
}
我正在调试我的代码以确保 Equals 正常工作。我在 Point.Equals 中设置的断点从未被击中。我在 Point.GetHashCode 中设置了一个断点,它也从未被击中。好像没有人用。
我知道在 .Net 中有 classes 称为 Point。我绝对确定我代码中的所有 Point 都来自我的自定义命名空间。
为什么我的Point.Equals和Point.GetHashCode在设置断点的时候不能到达?
Equals(a, b)
方法未被 IEquatable
命中,因此您需要调整它以适应界面。
试试这个:
public class Point : IEquatable<Point>
{
public double X;
public double Y;
public double Z;
private double[] startPointCoords;
public Point()
{
}
public Point(double[] pointArray)
{
this.startPointCoords = pointArray;
X = pointArray[0];
Y = pointArray[1];
Z = pointArray[2];
}
public override bool Equals(object obj) => Equals(obj as Point);
public bool Equals(Point other)
{
if (other is null)
return false;
if (ReferenceEquals(this, other))
return true;
return this.X == other.X &&
this.Y == other.Y &&
this.Z == other.Z;
}
public override int GetHashCode()
{
string xString = X.ToString().Replace(".", "");
string yString = Y.ToString().Replace(".", "");
string zString = Z.ToString().Replace(".", "");
int xInt = Convert.ToInt32(xString);
int yInt = Convert.ToInt32(yString);
int zInt = Convert.ToInt32(zString);
return xInt - yInt + zInt;
}
}
还有很多方法可以在 C# 中为自定义对象实现哈希码。虽然不完美,但一种简单的方法是使用匿名对象哈希:
public override int GetHashCode()
{
return new { X, Y, Z }.GetHashCode();
}