2011-10-13 63 views
6

'Equal'和'GetHashcode'方法存在於對象類中,而我們的類型繼承了對象基類。 直接實現對象的兩種方法和使用IComparer接口有什麼不同?爲什麼我們需要IEqualityComparer,IEqualityComparer <T>接口?

如果我們重寫對象的Equal和GetHashCode,並推送到散列表,它會使用overring的等號方法嗎?

與IEqualityComparer構造函數有什麼不同的新哈希表?

回答

14

當需要能夠「排序」對象的IComparable接口被使用,並且它給你告訴你,如果兩個對象<,或者=>的方法(CompareTo)。使用IEqualityComparer的構造函數可讓您給出與您的對象定義的值不同的特定Equals/GetHashCode。通常Hashtable將使用您的對象覆蓋EqualsGetHashCode(或基地objectEqualsGetHashCode)。

做出了榜樣,標準字符串區分大小寫的方式進行比較("A"!= "a"),但你可以做一個IEqualityComparer輔助類能夠哈希您的字符串大小寫不敏感的方式。 (技術上這個類是已經存在多個變種:他們被稱爲StringComparer.InvariantCultureIgnoreCase和所有的StringComparer其他靜態方法返回一個StringComparer對象實現了IComparerIEqualityComparerIComparer<string>IEqualityComparer<string>

作爲一個說明,該Hashtable用途一個IEqualityComparer可選參數,而不是通用版本IEqualityComparer<T>,因爲Hashtable是預泛型。

1

IComparer接口(泛型和非泛型接口)允許您將兩個實例相互比較。

Compare方法允許您將對象本身與另一個實例進行比較。 Offscourse,在當前實例爲空的情況下,在這種情況下,您將獲得NullReferenceException,因爲您在「空」實例上調用Compare。實施IComparer的課程可以解決這個問題。

所以,當你實現IComparer接口,你必須具有「比較」的方法,它可以被稱爲像這樣一類:

public class MyObjectComparer : IComparer<MyObject> 
{ 
    public int Compare(MyObject first, MyObject second) 
    { 
     // implement logic here to determine whether first is less, greater or equal then second. 
    } 
} 

這可以讓你做到這一點:

var c = new MyObjectComparer(); 
var one = new MyObject(); 
var two = new MyObject(); 
c.Compare (one, two); 

當你實例與在您指定的IEqualityComparer實例構造一個Hashtable,這意味着,給定IEqualityComparer將被用來確定某個特定鍵是否已經存在於哈希表。
否則,將使用鍵對象的Compare方法。

相關問題