2014-04-09 51 views
0

的情況下,我有以下情況其中的GetHashCode將主導的IComparer

class Custom 
{ 
    public override int GetHashCode(){...calculation1} 
} 

public class MyComparer : IEqualityComparer<Custom> 
{ 
    public bool Equals(Custom cus1, Custom cus2) 
    { 
     if (cus1 == null || cus2 == null) 
      return false; 

     return cus1.GetHashCode() == cus2.GetHashCode(); 
    } 

    public int GetHashCode(Custom cus1) 
    { 
     return ...calculation2; 
    } 
} 

int Main() 
{ 
    List<Custom> mine1 = new List<Custom>(){....}; 
    List<Custom> mine2 = new List<Custom>(){....}; 
    MyComparer myComparer = new MyComparer(); 
    List<Custom> result = mine1.intersect(mine2,myComparer); 
} 

這裏只是我想知道的GetHashCode將在交叉使用。

+3

'return cus1.GetHashCode()== cus2.GetHashCode();'這是一個可怕的平等觀念。在我看來,你的散列函數沒有正確設計速度。 – leppie

回答

0

你爲什麼不自己測試一下?你已經有了代碼...

MyComparer.GetHashCode將用於你的情況。你可以在這裏看到代碼:http://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs#f4105a494115b366

Custom.GetHashCode將被使用,如果你沒有在Intersect調用中指定比較器。

+0

所以優先級首先比較對象。但AFAIK默認的對象始終是第一優先。 – prabhakaran

+1

這裏沒有優先考慮的事情。當用戶不提供比較器時,「交叉」方法使用用戶提供的比較器或「DefaultEqualityComparer 」。 'DefaultEwualityComparer '調用對象的'GetHashCode'。 – MarcinJuraszek

0

一般來說,哈希碼以及getHashCode函數提供了一個很好的比較機制,但您應該注意相似性。在由散列設施支持的有限範圍的結果中,兩個不同的數字在相同的散列碼中可能會干擾比較上下文是很常見的。

1

要回答你的問題,它將從MyComparer中獲取GetHashCode。

,有一個很improtant之所以有一個GetHashCode的的Equals方法。 GetHashCode()是一種優化,因此當項目初始進行比較時,只檢查哈希代碼,如果哈希代碼相同,則使用Equals方法。這就避免了不同物體具有相同哈希的可能性(機會是大約40億美元的一次,但它仍然發生,看到它是第一個人)。在Equals()方法中,您應該比較從一個對象到另一個對象的所有相關字段。在Equals中通過hashcode比較對象是錯誤的,並且違背了這種方法的整個目的。

希望澄清。