在C#中创建GetHashCode方法

Ric*_*ton 9 .net c# hashcode gethashcode

在C#中为类创建自己的GetHashCode方法的最佳方法是什么?假设我有一个简单的类(它覆盖了Equals方法),如下所示:

class Test
{
   public string[] names;

   public double[] values;

   public override bool Equals(object obj)
   {
      return (obj is Test) && this.Equals((Test)obj);
   }

   public bool Equals(Test t)
   {
      return names.Equals(t.names) && values.Equals(t.values);
   }
}
Run Code Online (Sandbox Code Playgroud)

我应该使用GetHashCode方法的默认代码吗?

public override int GetHashCode()
{
   return base.GetHashCode();
}
Run Code Online (Sandbox Code Playgroud)

我应该将该方法基于我班级的内容吗?

public override int GetHashCode()
{
   return names.GetHashCode() + values.GetHashCode() ;
}
Run Code Online (Sandbox Code Playgroud)

或者我应该做些什么?

SLa*_*aks 12

System.Array不会覆盖GetHashCodeEquals,所以他们使用引用相等.因此,你不应该打电话给他们.

要实现GetHashCode,请参阅此问题.

要实现Equals,请使用SequenceEqual扩展方法.

编辑:在.Net 2.0上,你必须编写自己的版本SequenceEqual,如下所示:

public static bool SequenceEquals<T>(IList<T> first, IList<T> second) {
    if (first == second) return true;
    if (first == null || second == null) return false;

    if (first.Count != second.Count) return false;

    for (int i = 0; i < first.Count; i++)
        if (!first[i].Equals(second[i]))
            return false;

    return true;
}
Run Code Online (Sandbox Code Playgroud)

你可以把它写成IEnumerable<T>代替IList<T>,但它会有点慢,因为如果参数有不同的大小,它将无法提前退出.