2010-06-09 39 views
8

我怎樣才能讓自定義的對象(在這種情況下Href)列表中Distinct()方法的工作,這裏是當前對象的樣子:使用distinct自定義的對象列表

public class Href : IComparable, IComparer<Href> 
{ 
    public Uri URL { get; set; } 
    public UrlType URLType { get; set; } 

    public Href(Uri url, UrlType urltype) 
    { 
     URL = url; 
     URLType = urltype; 
    } 


    #region IComparable Members 

    public int CompareTo(object obj) 
    { 
     if (obj is Href) 
     { 
      return URL.ToString().CompareTo((obj as Href).URL.ToString()); 
     } 
     else 
      throw new ArgumentException("Wrong data type."); 
    } 

    #endregion 

    #region IComparer<Href> Members 

    int IComparer<Href>.Compare(Href x, Href y) 
    { 
     return string.Compare(x.URL.ToString(), y.URL.ToString()); 
    } 

    #endregion 
} 

回答

13

您需要以覆蓋EqualsGetHashCode

GetHashCode應該爲所有被認爲相等的實例返回相同的值。

例如:

public override bool Equals(object obj) { 
    Href other = obj as Href; 
    return other != null && URL.Equals(other.URL); 
} 

public override int GetHashCode() { 
    return URL.GetHashCode(); 
} 

由於NET的Uri類覆蓋GetHashCode的,你可以簡單地返回該URL的哈希碼。

+0

我不明白爲什麼我們要重寫接口 – 2010-06-09 14:51:51

+0

@Burnzy的方法:這裏沒有介入的接口。這些方法是從'Object'繼承的。 – SLaks 2010-06-09 15:09:27

0

你可以抓住的aku's comparer副本(但是GetHashCode實施提防),然後寫這樣的事情

hrefList.Distinct(new Comparer<Href>((h1,h2)=>h1.URL==h2.URL)) 
+0

這不起作用。 (''Distinct' _requires_'GetHashCode') – SLaks 2010-06-09 15:10:04

+0

是的,它是非常酷的東西,但是,我不太確定aku的比較代理/只讀是如何映射到一個方法 – 2010-06-09 15:27:02

+0

但是,它會工作得很慢,因爲所有的哈希碼是相同的。 – SLaks 2010-06-09 15:42:03

相關問題