2013-01-15 39 views
1

大家好,我想知道爲什麼它不工作需要一些幫助。我有一個列表鏈接和一些數據我想通過鏈接主機清除列表在這裏的代碼不同的IEqualityComparer <>問題

public class DataContainerEqualityComparer : IEqualityComparer<DataContainer> 
     { 
      public bool Equals(DataContainer x, DataContainer y) 
      { 
       return x.Url.Host == y.Url.Host; 
      } 

      public int GetHashCode(DataContainer obj) 
      { 
       return obj.Url.GetHashCode(); 
      } 
     } 

List<DataContainer> items = new List<DataContainer>(); 
var item = new DataContainer("http://google.com/123"); 
items.Add(item); 
item = new DataContainer("http://google.com/1234"); 
items.Add(item); 
item = new DataContainer("http://google.com/12345"); 
items.Add(item); 
item = new DataContainer("http://google.com/123456"); 
items.Add(item); 
item = new DataContainer("http://google.com/1234567"); 
items.Add(item);     
items = items.Distinct(new DataContainerEqualityComparer()).ToList(); 

此後沒有任何反應。 Thx提前。

+1

當你說「什麼都沒有發生」時,你是什麼意思?應該發生什麼? –

+0

我的意思是,我期望在收集只留下一個對象。丹尼爾解釋我的代碼thx你們所有人有什麼不妥))) – gingray

回答

13

您實施時遇到的問題是您要返回Url的哈希碼,而不是主機的哈希碼。

將其更改爲這一點,並預期它應該工作:

public int GetHashCode(DataContainer obj) 
{ 
    return obj.Url.Host.GetHashCode(); 
} 

當檢查相等的兩個對象會發生以下情況:

首先,GetHashCode叫上兩個對象。如果散列碼不同,則認爲對象不相同,並且Equals從未稱爲
Equals僅當GetHashCode爲兩個對象返回相同的值時才被調用。