Точка останова при имплементации Equals на IEqualityComparer <CustomClass>никогда не достигается - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть простой пользовательский класс Point:

    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;
    }
}

Я использую этот класс в словаре. Я проверяю, был ли экземпляр точки добавлен в словарь, используя:

            if (!pointsToProcess.ContainsKey(startPoint))
            {
                pointsToProcess.Add(startPoint, startPoint);
            }

Я отлаживаю свой код, чтобы убедиться, что Equals работает правильно. Моя точка останова, которую я установил в Point.Equals, никогда не срабатывает. Я установил точку останова в Point.GetHashCode, и она никогда не срабатывает. Кажется, что они не используются.

Я знаю, что есть классы, называемые Point in. Net. Я абсолютно уверен, что все точки, которые у меня есть в моем коде, взяты из моего пользовательского пространства имен.

Почему мои Point.Equals и Point.GetHashCode не будут достигнуты при установке точки останова?

1 Ответ

1 голос
/ 09 апреля 2020

Метод 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();
}
...