2011-07-15 77 views
1

我有一個符號實體,相比於其他的時候有這種行爲:如何實現此自定義平等?

  1. 如果filename & FILEDATE相等,返回True
  2. 如果FILEDATE是不同的,然後比較各CRC32和返回值

我想知道如何實現這個平等,特別是GetHashCode()在這種情況下。

+1

是你的問題如何實現GetHashCode()特別是,或者包含哪些字段?哈希碼最主要的地方在於,對於不同的事物來說,它可以具有相同的哈希碼(雖然不是最優的),但是對於具有不同哈希碼的等價物來說它是非常糟糕的。因此,最低限度,您希望爲哈希碼選擇等價字段的最小公分母。在你的情況下,它看起來像FileName。 (我假設在#2上,當你說「如果FileDate是不同的」,你推斷FileName仍然是相同的,對嗎? –

+0

你在'Equals()'的override中寫了什麼? –

+0

好的我很關心GetHashCode(),這會清除它。 – Sunit

回答

1

我會說(基於我對你的例子的理解),像這樣的東西。你可以包含一個更復雜的哈希碼,它與你的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(); 
     } 
    } 
0
 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

這基本上就是詹姆斯·邁克爾·黑爾建議我只是慢。