我有一個符號實體,相比於其他的時候有這種行爲:如何實現此自定義平等?
- 如果filename & FILEDATE相等,返回True
- 如果FILEDATE是不同的,然後比較各CRC32和返回值
我想知道如何實現這個平等,特別是GetHashCode()在這種情況下。
我有一個符號實體,相比於其他的時候有這種行爲:如何實現此自定義平等?
我想知道如何實現這個平等,特別是GetHashCode()在這種情況下。
我會說(基於我對你的例子的理解),像這樣的東西。你可以包含一個更復雜的哈希碼,它與你的FileDate和CRC32相似,但是真的,因爲常用的膠水總是FileName,你可以用它作爲你的代理散列碼。記住,Equal()對象不應該有不同的哈希碼,但是!Equal()對象可能有相同的(它只是一個潛在的碰撞)。
而且你要小心是哈希碼是可變的欄位,否則該對象的散列碼可「改變」,這可能是一個非常詞典壞...
public sealed class Symbol : IEquatable<Symbol>
{
public string FileName { get; set; }
public DateTime FileDate { get; set; }
public long CRC32 { get; set; }
public bool Equals(Symbol other)
{
if (other == null)
{
return false;
}
return FileName == other.FileName &&
(FileDate == other.FileDate || CRC32 == other.CRC32);
}
public override bool Equals(object obj)
{
return Equals(obj as Symbol);
}
public override int GetHashCode()
{
// since FileName must be equal (others may or may not)
// can use its hash code as your surrogate hash code.
return FileName.GetHashCode();
}
}
public override bool Equals(object obj)
{
var file = obj as Symbol;
if (file.FileName == FileName && file.FileDate == FileDate)
return true
else
return Boolean Value of [Compare CRC Here];
}
以下是如何計算文件上的CRC。
http://damieng.com/blog/2006/08/08/calculating_crc32_in_c_and_net
這基本上就是詹姆斯·邁克爾·黑爾建議我只是慢。
是你的問題如何實現GetHashCode()特別是,或者包含哪些字段?哈希碼最主要的地方在於,對於不同的事物來說,它可以具有相同的哈希碼(雖然不是最優的),但是對於具有不同哈希碼的等價物來說它是非常糟糕的。因此,最低限度,您希望爲哈希碼選擇等價字段的最小公分母。在你的情況下,它看起來像FileName。 (我假設在#2上,當你說「如果FileDate是不同的」,你推斷FileName仍然是相同的,對嗎? –
你在'Equals()'的override中寫了什麼? –
好的我很關心GetHashCode(),這會清除它。 – Sunit