Frage

Wie kann ich das machen Distinct() Methode funktioniert mit einer Liste von benutzerdefiniertem Objekt (Href in diesem Fall) hier ist, was das aktuelle Objekt aussieht:

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
}
War es hilfreich?

Lösung

Sie müssen überschreiben Equals und GetHashCode.

GetHashCode Sollte den gleichen Wert für alle Fälle zurückgeben, die als gleich angesehen werden.

Zum Beispiel:

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

Da die URI -Klasse von .NET Gethashcode überschreibt, können Sie einfach den Hashcode der URL zurückgeben.

Andere Tipps

Sie könnten eine Kopie von holen Akus Vergleich (Vorsicht vor dem GetHashCode Implementierung jedoch) und dann so etwas schreiben

hrefList.Distinct(new Comparer<Href>((h1,h2)=>h1.URL==h2.URL))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top