2014-10-28 125 views
0

我想用我的數據Distinct(),聲明爲IEnumerable<KeyValuePair<IdentType, string>>。在這種情況下,我必須實現我自己的IEqualityComparer,這裏有我的問題:string.GetHashCode和IEqualityComparer之間的區別<string> .Default.GetHashCode

下面的實現有什麼區別嗎?

public int GetHashCode(KeyValuePair<IdentType, string> obj) { 
    return EqualityComparer<string>.Default.GetHashCode(obj.Value); 
} 

public int GetHashCode(KeyValuePair<IdentType, string> obj) { 
    return obj.Value.GetHashCode(); 
} 

回答

1

不是,它不會。實施將是相同的,因爲他們都稱實際課程爲GetHashCode(),在這種情況下爲string

在年底,CreateComparer方法EqualityComparercreatesGenericEqualityComparer裏面,它的實現是GetHashCode是:

public override int GetHashCode(T obj) { 
    if (obj == null) return 0; 
    return obj.GetHashCode(); 
} 

在這種情況下,obj將原來string,你本來叫GetHasCode上。唯一會導致其行爲不同的唯一情況是當您的stringnull

1

只有一個:如果字符串爲空,等於比較器的GetHashCode將返回0,而第二個實現將拋出異常。

1

一個區別是,當您將null傳遞給它(demo)時,EqualityComparer<string>.Default.GetHashCode不會崩潰。

除此之外,結果將是相同的設計,因爲System.String實現IEquatable<System.String>

默認屬性檢查類型T是否實現System.IEquatable<T>通用接口,如果是這樣,則返回EqualityComparer<T>調用的執行的IEquatable<T>.Equals方法。否則,返回EqualityComparer<T>,如T所提供。

2

你的兩種方法只有很小的差異。

EqualityComparer<string>.Default如果類暗示IEquateable<T>(該字符串),將返回類型爲GenericEqualityComparer<T>的類。這樣GetHashCode(obj.Value)被調用到

public override int GetHashCode(T obj) { 
     if (obj == null) return 0; 
     return obj.GetHashCode(); 
    } 

是一樣的,你打電話obj.Value.GetHashCode();直接,除了一個事實,如果你有一個空字符串默認的比較將返回0,直接調用版本將拋出一個空引用例外。