2010-06-09 9 views
8

¿Cómo puedo hacer el trabajo Distinct() método con una lista de objetos personalizados (Href en este caso), esto es lo que se ve el objeto actual como:El uso de distintos con lista de objetos personalizados

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 
} 

Respuesta

13

Es necesario para anular Equals y GetHashCode.

GetHashCode debe devolver el mismo valor para todas las instancias que se consideran iguales.

Por ejemplo:

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

Desde la clase Uri de .Net anula GetHashCode, simplemente puede devolver código hash de la URL.

+0

no estoy seguro de por qué nos van a sustituir, un método de la interfaz de –

+0

@Burnzy: No hay interfaz involucrada aquí. Estos métodos se heredan de 'Object'. – SLaks

0

Se podría hacerse con una copia de aku's comparer (cuidado con la aplicación GetHashCode sin embargo), y luego escribir algo como esto

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

Esto no funcionará. ('Distinct _ _quotes_' GetHashCode') – SLaks

+0

Sí, lo hace, y eso es bastante bueno, sin embargo, no estoy muy seguro de cómo el delegador comparador de aku/readonly está mapeando a un método –

+0

Sin embargo, funcionará muy lentamente ya que todos de los hashcodes son lo mismo. – SLaks

Cuestiones relacionadas