Verwendung von Unterschieden mit Liste der benutzerdefinierten Objekte
-
25-09-2019 - |
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
}
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