2010-06-09 22 views
8

Jak mogę uczynić pracę Distinct() metodę z listy niestandardowej obiektu (Href w tym przypadku), tutaj jest to, co obecny obiekt wygląda tak:Zastosowanie odrębnych z listy obiektów niestandardowych

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 
} 

Odpowiedz

13

Trzeba zastąpić Equals i GetHashCode.

GetHashCode powinien zwracać tę samą wartość dla wszystkich wystąpień, które są uznawane za równe.

Na przykład:

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

Ponieważ klasa .NET za Uri nadpisuje GetHashCode, można po prostu wrócić hashcode adresu URL.

+0

nie jestem pewien, dlaczego jesteśmy przesłanianie metody interfejsu –

+0

@Burnzy: Nie ma tu żadnego interfejsu. Te metody są dziedziczone z 'Object'. – SLaks

0

Można pobrać kopię aku's comparer (uwaga realizacji GetHashCode jednak), a następnie napisać coś w tym

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

To nie zadziała. ('Distinct' _requires_' GetHashCode') – SLaks

+0

Tak, robi to, i to jest całkiem fajne rzeczy, jednak nie jestem do końca pewien, jak delegat aku jest delegatem/readonly mapuje do metody –

+0

Jednak będzie działał bardzo powoli, ponieważ wszystkie z hashcode są takie same. – SLaks

Powiązane problemy