.net 3.5 List<T> 相等和 GetHashCode

标签 .net list equality

我在具有列表 <T> 的自定义类中实现 IEquatable作为一个属性,像这样:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public List<string> Dislikes;

    public bool Equals(Person p)
    {
        if (p == null)
        {
            return false;
        }
        if (object.ReferenceEquals(this, p))
        {
            return true;
        }

        return this.FirstName == p.FirstName 
            && this.LastName == p.LastName
            && this.Dislikes == p.Dislikes; //or this.Dislikes.Equals(p.Dislikes)
    }

    public override int GetHashCode()
    {
        int hash = 17;
        hash = hash * 23 + (this.FirstName ?? String.Empty).GetHashCode();
        hash = hash * 23 + (this.LastName ?? String.Empty).GetHashCode();
        hash = hash * 23 + this.Dislikes.GetHashCode();
        return hash;
    }
}

我在尝试实现 Equals 和 GetHashCode 方法时担心 List。具体来说,将列表<T> .equals 评估它的内容是否相等?同样对于列表 <T> .GetHashCode?

最佳答案

不, .Equals 只会进行引用比较,而 GetHashCode 将返回每个对象分配的标准代码。

如果您想根据列表的内容执行 .Equals ,您必须自己枚举它,就像生成哈希码一样明智。

关于.net 3.5 List<T> 相等和 GetHashCode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2068226/

相关文章:

.net - 不同类型的用户控件的 WPF 列表

list - 如何在 Haskell 中创建无限重复列表?

c# - 值等于和循环引用 : how to resolve infinite recursion?

c++ - 在没有 RTTI 的情况下测试类型相等性

c# - 两个不同的 "strings"是同一个对象实例吗?

c# - Pythonnet如何正确停止脚本执行

python - 在 python 中交换列表中的元素

c# - NUnit 2.5.6 + PartCover 2.0/4.0 = 我的类(class)未显示

c# - 重命名现有文件名

c# - 图像格式转换异常缓慢