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
不会覆盖GetHashCode
或Equals
,所以他们使用引用相等.因此,你不应该打电话给他们.
要实现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>
,但它会有点慢,因为如果参数有不同的大小,它将无法提前退出.
归档时间: |
|
查看次数: |
12166 次 |
最近记录: |