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