永远不会命中 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();
}