2010-06-09 10 views
8

Come posso fare il lavoro Distinct() metodo con un elenco di oggetto personalizzato (Href in questo caso), qui è ciò che l'oggetto corrente assomiglia:L'utilizzo di distinte con lista di oggetti personalizzati

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 
} 

risposta

13

È necessario per ignorare Equals e GetHashCode.

GetHashCode deve restituire lo stesso valore per tutte le istanze considerate equivalenti.

Ad esempio:

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(); 
} 

Dal classe Uri della Net sovrascrive GetHashCode, si può semplicemente tornare codice hash dell'URL.

+0

io non sono del tutto sicuro perché siamo l'override un metodo dell'interfaccia –

+0

@Burnzy: Non ci sono interfacce coinvolte qui. Questi metodi sono ereditati da 'Object'. – SLaks

0

Si potrebbe prendere una copia di aku's comparer (fate attenzione al GetHashCode implementazione però), e poi scrivere qualcosa del genere

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

Questo non funzionerà. ('Distinct' _requires_' GetHashCode') – SLaks

+0

Sì, lo fa, ed è roba piuttosto interessante, tuttavia, non sono abbastanza sicuro di come il comparatore di aku delega/readonly stia mappando su un metodo –

+0

Tuttavia, funzionerà molto lentamente da quando tutto degli hashcode sono gli stessi. – SLaks

Problemi correlati