2013-04-15 46 views
0

我需要知道使用哈希碼來比較許多對象的方法。所以這裏是其中一個班。使用哈希碼比較對象的屬性

public class Test: IEquatable<Test> 
{ 
    public Test() 
    { 
    } 

    public string ID { get; set; } 
    public string Name{ get; set; } 

    public static int SafeGetHashCode<T>(this T value) where T : class 
    { 
     return value == null ? 0 : value.GetHashCode(); 
    } 

    public override int GetHashCode() 
    { 
     int hash = 19; 
     hash = hash * 31 + ID.SafeGetHashCode(); 
     hash = hash * 31 + Name.SafeGetHashCode(); 
     return hash; 
    } 

    public override bool isSame(object obj) 
    { 
     // compare objects here 
    } 
} 

但是有2個錯誤。兩者都是一樣的。

「字符串」中不包含關於「SafeGetHashCode」和沒有擴展方法「SafeGetHashCode」接受類型「字符串」的第一個參數的定義可以找到(是否缺少using指令或程序集引用?)

而對於isSame(),我不知道如何編寫代碼。該概念是比較所有對象,如果有2個相同的ID名稱,將它們組合在一起。

Item A = new Item(); 
Item B = new Item(); 
Item c = new Item(); 

A.ID = "Exam1"; 
A.Name = "Apple"; 

B.ID = "Exam1"; 
B.Name = "Orange"; 

C.ID = "Exam1"; 
C.Name = "Apple"; 

因此,項目A和C將組合在一起。

+0

你的'isSame'意思是'Equals'嗎? –

回答

2

擴展方法必須是靜態類的成員,它應該處理第一個錯誤。移動SafeGetHashCode你的Test類的,所以你可以使用它作爲擴展的String和其他引用類型:

public static class TestHashCodeExtension 
{ 
    public static int SafeGetHashCode<T>(this T value) where T : class 
    { 
     return value == null ? 0 : value.GetHashCode(); 
    } 
} 

至於實施IEquatable<T>.Equals(我假設你isSame只是不正確命名的方法,還奇怪地打上override - 有任何.NET類的沒有isSame,尤其是在Object沒有):

  • 確保實現基地Equals以及IEquatable<T>.Equals
  • 看到樣品中IEquatable.Equals執行兩個Equals來電

縮短樣品:

public bool Equals(Test other) 
{ 
    return (other == null) ? 
    false : (Id == other.Id) && (Name == other.Name); 
} 

public override bool Equals(Object obj) 
{ 
    Test testObj = obj as Test; 
    return testObj == null ? false : Equals(testObj); 
} 

注:通常Equals並不需要使用GetHashCode第一。 Dictionary(主要原因GetHashCode存在)總是在調用Equals之前檢查哈希碼本身。在大多數情況下,GetHashCodeEquals都是按照每個成員的哈希/比較來實現的。因此,除非您確定您的班級緩存結果爲GetHashCode,否則沒有實際的理由檢查Equals中的哈希碼,因爲您最終每次觸摸兩次(如果第一個字段與GetHashCode不相同,則Equals可以進行短路比較需要使用全部/大部分字段來計算結果)。

+0

如果我這樣做,我不能使用測試作爲類型參數。 –

+0

@kingjia,如果你做什麼?您需要將SafeGetHashCode移到Test類之外。 –

+0

我想問。哈希碼用於比較Equals()方法內的對象嗎? –

2

個人而言,我只希望它內聯 - 無需額外的方法:

public override int GetHashCode() 
{ 
    int hash = 19; 
    hash = hash * 31 + (ID == null ? 0 : ID.GetHashCode()); 
    hash = hash * 31 + (Name == null ? 0 : Name.GetHashCode()); 
    return hash; 
} 

添加不受約束的擴展方法污染之類的智能感知。