加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在C#中创建GetHashCode方法

发布时间:2020-12-15 03:52:07 所属栏目:百科 来源:网络整理
导读:为C#中的类创建自己的GetHashCode方法的最佳方式是什么?假设我有一个简单的类(覆盖Equals方法),如下所示: class Test { public string[] names; public double[] values; public override bool Equals(object obj) { return (obj is Test) this.Equals((Te
为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>但是它会稍微慢些,因为如果参数具有不同的大小,它将不能提早退出.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读