在C#中创建GetHashCode方法

为C#中的类创建自己的GetHashCode方法的最佳方式是什么?假设我有一个简单的类(覆盖Equals方法),如下所示: @H_502_2@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方法代码吗?

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

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

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

还是应该做别的事情?

解决方法

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

要实现GetHashCode,请参阅this question.

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

编辑:在.NET 2.0中,您必须编写自己的SequenceEqual版本,如下所示:

@H_502_2@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>但是它会稍微慢些,因为如果参数具有不同的大小,它将不能提早退出.

相关文章

目录简介使用JS互操作使用ClipLazor库创建项目使用方法简单测...
目录简介快速入门安装 NuGet 包实体类User数据库类DbFactory...
本文实现一个简单的配置类,原理比较简单,适用于一些小型项...
C#中Description特性主要用于枚举和属性,方法比较简单,记录...
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机...
目录简介获取 HTML 文档解析 HTML 文档测试补充:使用 CSS 选...