'Equal'和'GetHashcode'方法存在於對象類中,而我們的類型繼承了對象基類。 直接實現對象的兩種方法和使用IComparer接口有什麼不同?爲什麼我們需要IEqualityComparer,IEqualityComparer <T>接口?
如果我們重寫對象的Equal和GetHashCode,並推送到散列表,它會使用overring的等號方法嗎?
與IEqualityComparer構造函數有什麼不同的新哈希表?
'Equal'和'GetHashcode'方法存在於對象類中,而我們的類型繼承了對象基類。 直接實現對象的兩種方法和使用IComparer接口有什麼不同?爲什麼我們需要IEqualityComparer,IEqualityComparer <T>接口?
如果我們重寫對象的Equal和GetHashCode,並推送到散列表,它會使用overring的等號方法嗎?
與IEqualityComparer構造函數有什麼不同的新哈希表?
當需要能夠「排序」對象的IComparable
接口被使用,並且它給你告訴你,如果兩個對象<,或者=>的方法(CompareTo
)。使用IEqualityComparer
的構造函數可讓您給出與您的對象定義的值不同的特定Equals
/GetHashCode
。通常Hashtable
將使用您的對象覆蓋Equals
和GetHashCode
(或基地object
Equals
和GetHashCode
)。
做出了榜樣,標準字符串區分大小寫的方式進行比較("A"
!= "a"
),但你可以做一個IEqualityComparer
輔助類能夠哈希您的字符串大小寫不敏感的方式。 (技術上這個類是已經存在多個變種:他們被稱爲StringComparer.InvariantCultureIgnoreCase
和所有的StringComparer
其他靜態方法返回一個StringComparer
對象實現了IComparer
,IEqualityComparer
,IComparer<string>
,IEqualityComparer<string>
)
作爲一個說明,該Hashtable
用途一個IEqualityComparer
可選參數,而不是通用版本IEqualityComparer<T>
,因爲Hashtable
是預泛型。
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方法。