【问题标题】:.net 3.5 List<T> Equality and GetHashCode.net 3.5 List<T> 等式和 GetHashCode
【发布时间】:2010-01-14 23:07:45
【问题描述】:

我在具有 List&lt;T&gt; 作为属性的自定义类中实现 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。具体来说,List&lt;T&gt;.Equals 会评估其内容的相等性吗? List&lt;T&gt;.GetHashCode 也是如此?

【问题讨论】:

  • public List&lt;string&gt; Dislikes; 不是一个属性,它是一个字段

标签: .net list equality


【解决方案1】:

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

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

【讨论】:

  • 是的。给定字段的“权重”,仅使用列表的 Count 属性使 GetHashCode() 快速。
  • @AnthonyWJones:谢谢,这是我的假设,因为 List 似乎没有从 Object 重载这些方法,但我想确认一下。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-20
  • 1970-01-01
  • 2011-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-11
相关资源
最近更新 更多