在C#中创建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);
      }
   }

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

public override int GetHashCode()
  {
     return base.GetHashCode();
  }

我应该根据我的课程内容方法

public override int GetHashCode()
  {
     return names.GetHashCode() + values.GetHashCode() ;
  }

还是应该做别的事情?

解决方法

System.Array不会覆盖GetHashCode或Equals,所以他们使用引用相等.所以你不应该叫他们.

要实现GetHashCode,请参阅this question.

要实现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;
}

您可以将其写入IEnumerable< T>而不是IList< T>但是它会稍微慢些,因为如果参数具有不同的大小,它将不能提早退出.

相关文章

原文地址:http://msdn.microsoft.com/en-us/magazine/cc163...
前言 随着近些年微服务的流行,有越来越多的开发者和团队所采...
最近因为比较忙,好久没有写博客了,这篇主要给大家分享一下...
在多核CPU在今天和不久的将来,计算机将拥有更多的内核,Mic...
c语言输入成绩怎么判断等级
字符型数据在内存中的存储形式是什么