GetHashCode()方法(C#)
答案:2 悬赏:80 手机版
解决时间 2021-01-25 22:56
- 提问者网友:献世佛
- 2021-01-25 15:36
我写了一个类,用它来模拟点(Point)结构,但是里面有个GetHashCode()在自定义equals方法之后必须写,那么这个GetHashCode()到底该怎么写呢?事实上我直接在里面写一句return 0;应该也不会出错吧,但是哈希码要保证唯一,那么这里面该怎么实现呢?如果可以,能不能解说一下Point结构是怎么实现这个方法的?谢谢!
最佳答案
- 五星知识达人网友:时间的尘埃
- 2021-01-25 16:47
Object..::.GetHashCode 方法
更新:2007 年 11 月
用作特定类型的哈希函数。
命名空间: System
程序集: mscorlib(在 mscorlib.dll 中)
语法
Visual Basic(声明)
Public Overridable Function GetHashCode As Integer
Visual Basic (用法)
Dim instance As Object
Dim returnValue As Integer
returnValue = instance.GetHashCode()
C#
public virtual int GetHashCode()
Visual C++
public:
virtual int GetHashCode()
J#
public int GetHashCode()
JScript
public function GetHashCode() : int
返回值
类型:System..::.Int32
当前 Object 的哈希代码。
备注
GetHashCode 方法适用于哈希算法和诸如哈希表之类的数据结构。
GetHashCode 方法的默认实现不保证针对不同的对象返回唯一值。而且,.NET Framework 不保证 GetHashCode 方法的默认实现以及它所返回的值在不同版本的 .NET Framework 中是相同的。因此,在进行哈希运算时,该方法的默认实现不得用作唯一对象标识符。
GetHashCode 方法可以由派生类型重写。值类型必须重写此方法,以提供适合该类型的哈希函数和在哈希表中提供有用的分布。为了获得最佳结果,哈希代码必须基于实例字段或属性(而非静态字段或属性)的值。
用作 Hashtable 对象中键的对象还必须重写 GetHashCode 方法,因为这些对象必须生成其各自的哈希代码。如果用作键的对象不提供 GetHashCode 的有用实现,您可以在构造 Hashtable 对象时指定哈希代码提供程序。在 .NET Framework 2.0 版之前,哈希代码提供程序是基于 System.Collections..::.IHashCodeProvider 接口的。从 2.0 版开始,哈希代码提供程序基于 System.Collections..::.IEqualityComparer 接口。
对实现者的说明:
哈希函数用于快速生成一个与对象的值相对应的数字(哈希代码)。哈希函数通常是特定于每个 Type 的,而且,必须至少使用一个实例字段作为输入。
哈希函数必须具有以下特点:
如果两个对象的比较结果相等,则每个对象的 GetHashCode 方法都必须返回同一个值。但是,如果两个对象的比较结果不相等,则这两个对象的 GetHashCode 方法不一定返回不同的值。
一个对象的 GetHashCode 方法必须总是返回同一个哈希代码,但前提是没有修改过对象状态,对象状态用来确定对象的 Equals 方法的返回值。请注意,这仅适用于应用程序的当前执行,再次运行该应用程序时可能会返回另一个哈希代码。
为了获得最佳性能,哈希函数必须为所有输入生成随机分布。
更新:2007 年 11 月
用作特定类型的哈希函数。
命名空间: System
程序集: mscorlib(在 mscorlib.dll 中)
语法
Visual Basic(声明)
Public Overridable Function GetHashCode As Integer
Visual Basic (用法)
Dim instance As Object
Dim returnValue As Integer
returnValue = instance.GetHashCode()
C#
public virtual int GetHashCode()
Visual C++
public:
virtual int GetHashCode()
J#
public int GetHashCode()
JScript
public function GetHashCode() : int
返回值
类型:System..::.Int32
当前 Object 的哈希代码。
备注
GetHashCode 方法适用于哈希算法和诸如哈希表之类的数据结构。
GetHashCode 方法的默认实现不保证针对不同的对象返回唯一值。而且,.NET Framework 不保证 GetHashCode 方法的默认实现以及它所返回的值在不同版本的 .NET Framework 中是相同的。因此,在进行哈希运算时,该方法的默认实现不得用作唯一对象标识符。
GetHashCode 方法可以由派生类型重写。值类型必须重写此方法,以提供适合该类型的哈希函数和在哈希表中提供有用的分布。为了获得最佳结果,哈希代码必须基于实例字段或属性(而非静态字段或属性)的值。
用作 Hashtable 对象中键的对象还必须重写 GetHashCode 方法,因为这些对象必须生成其各自的哈希代码。如果用作键的对象不提供 GetHashCode 的有用实现,您可以在构造 Hashtable 对象时指定哈希代码提供程序。在 .NET Framework 2.0 版之前,哈希代码提供程序是基于 System.Collections..::.IHashCodeProvider 接口的。从 2.0 版开始,哈希代码提供程序基于 System.Collections..::.IEqualityComparer 接口。
对实现者的说明:
哈希函数用于快速生成一个与对象的值相对应的数字(哈希代码)。哈希函数通常是特定于每个 Type 的,而且,必须至少使用一个实例字段作为输入。
哈希函数必须具有以下特点:
如果两个对象的比较结果相等,则每个对象的 GetHashCode 方法都必须返回同一个值。但是,如果两个对象的比较结果不相等,则这两个对象的 GetHashCode 方法不一定返回不同的值。
一个对象的 GetHashCode 方法必须总是返回同一个哈希代码,但前提是没有修改过对象状态,对象状态用来确定对象的 Equals 方法的返回值。请注意,这仅适用于应用程序的当前执行,再次运行该应用程序时可能会返回另一个哈希代码。
为了获得最佳性能,哈希函数必须为所有输入生成随机分布。
全部回答
- 1楼网友:一袍清酒付
- 2021-01-25 17:44
写个方法
/// <summary>
/// 返回执行select distinct后的datatable
/// </summary>
/// <param name="sourcetable">源数据表</param>
/// <param name="fieldnames">字段集</param>
/// <returns></returns>
private datatable selectdistinct(datatable sourcetable, params string[] fieldnames)
{
object[] lastvalues;
datatable newtable;
datarow[] orderedrows;
if (fieldnames == null || fieldnames.length == 0)
throw new argumentnullexception("fieldnames");
lastvalues = new object[fieldnames.length];
newtable = new datatable();
foreach (string fieldname in fieldnames)
newtable.columns.add(fieldname, sourcetable.columns[fieldname].datatype);
orderedrows = sourcetable.select("", string.join(",", fieldnames));
foreach (datarow row in orderedrows)
{
if (!fieldvaluesareequal(lastvalues, row, fieldnames))
{
newtable.rows.add(createrowclone(row, newtable.newrow(), fieldnames));
setlastvalues(lastvalues, row, fieldnames);
}
}
return newtable;
}
private bool fieldvaluesareequal(object[] lastvalues, datarow currentrow, string[] fieldnames)
{
bool areequal = true;
for (int i = 0; i < fieldnames.length; i++)
{
if (lastvalues[i] == null || !lastvalues[i].equals(currentrow[fieldnames[i]]))
{
areequal = false;
break;
}
}
return areequal;
}
private datarow createrowclone(datarow sourcerow, datarow newrow, string[] fieldnames)
{
foreach (string field in fieldnames)
newrow[field] = sourcerow[field];
return newrow;
}
private void setlastvalues(object[] lastvalues, datarow sourcerow, string[] fieldnames)
{
for (int i = 0; i < fieldnames.length; i++)
lastvalues[i] = sourcerow[fieldnames[i]];
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯