C#运算符重载:Object.Equals(object o)& Object.GetHashCode()

时间:2018-02-21 06:05:15

标签: c# operator-overloading binary-search-tree

所以我创建了一个BST并希望它成为一个通用树,现在我正在开发Node<T>类。我需要一些操作符重载细节的帮助。课程如下:

public class Node<T> where T : IComparable
{
    //Private member data
    private T data;
    private Node<T> left;
    private Node<T> right;
    //private readonly IComparer<T> _comparer;

    //Node constructor
    public Node()
    {
        data = default(T); //
        left = null;
        right = null;
    }

    //Setters/getters for node private data members
    public T Data
    {
        get { return data; }
        set { data = value; }
    }

    public Node<T> Left
    {
        get { return left; }
        set { left = value; }
    }

    public Node<T> Right
    {
        get { return right; }
        set { right = value; }
    }

    public static bool operator ==(Node<T> lhs, Node<T> rhs)
    {
        if((lhs.Data).CompareTo(rhs.Data) == 0)
        {
            return true;
        }
        else
        {
            return false;
        }

    }

    public static bool operator !=(Node<T> lhs, Node<T> rhs)
    {
        if (lhs.Data.CompareTo(rhs.Data) != 0)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

但Visual Studio(以及我在网上看过的消息来源)说我需要重载Object.Equals(object o)方法以及Object.GetHashCode。

从我对.Equals的了解只是通过使用C#,它就像值类型语义,或者将比较2个对象的值而不是它们的引用,也就是检查它们是否实际上是同一个对象,我想想比较对象时通常会做什么。所以这就是我试图做的事情:

public override bool Equals(Object obj)
{
    if ((lhs.Data).CompareTo(rhs.Data) == 0)
    {
        return true;
    }
    else
    {
        return false;
    }
}

它与我的==运算符基本相同,但它不起作用,因为lhs / rhs参数不存在。我不知道如何为我的情况做到这一点,因为我相信它将被称为n1.Equals(n2),并将检查节点的数据值是否相同。在线的例子对我来说不清楚。我也不知道为什么我必须涉及这种哈希方法,但我仍然在尝试对此进行研究。现在对Equals覆盖感到非常好奇。

1 个答案:

答案 0 :(得分:0)

确保根据MS指南实施Equals方法。这是我的片段。我一直都在使用:

        // override object.Equals
public override bool Equals(object obj)
    {
        // shortcut
        if (object.ReferenceEquals(this, obj))
        {
            return true;
        }

        // check for null and make sure we do not break oop / inheritance
        if (obj == null || GetType() != obj.GetType())
        {
            return false;
        }

        // TODO: write your implementation of Equals() here
        // do not call base.equals !        
        throw new NotImplementedException();

        return false;
    }

    public static bool operator ==(Class lobj, Class robj)
    {
        // users expect == working the same way as Equals
        return object.Equals(lobj, robj);
    }

    public static bool operator !=(Class lobj, Class robj)
    {
        return !object.Equals(lobj, robj);
    }

    // override object.GetHashCode
    public override int GetHashCode()
    {
        // TODO: write your implementation of GetHashCode() here
        // return field.GetHashCode() ^ field2.GetHashCode() ^ base.GetHashCode();
        // or simply return the unique id if any

        throw new NotImplementedException();
    }