Ich versuche herauszufinden, welche dieser Schnittstellen ich implementieren muss. Beide machen im Wesentlichen dasselbe. Wann würde ich eins über das andere verwenden?
.net
icomparable
icomparer
Micah
quelle
quelle
Antworten:
Nun, sie sind nicht ganz dasselbe wie
IComparer<T>
bei einem Typ, der zwei verschiedene Objekte vergleichen kann, währendIComparable<T>
sie bei Typen implementiert sind, die sich mit anderen Instanzen desselben Typs vergleichen können.Ich neige dazu,
IComparable<T>
Zeiten zu verwenden, in denen ich wissen muss, wie sich eine andere Instanz auf eine Instanz beziehtthis
.IComparer<T>
ist nützlich zum Sortieren von Sammlungen, da dieIComparer<T>
Stände außerhalb des Vergleichs liegen.quelle
IComparable
wie ich vergleichbar bin . was bedeutet, dass ich mit etwas anderem verglichen werden kann. UndIComparer
wenn ich ein Vergleicher bin, vergleiche ich einfach, was bedeutet, dass ich einige Dinge vergleiche.Verwenden Sie diese Option,
IComparable<T>
wenn die Klasse einen intrinsischen Vergleich aufweist.Verwenden
IComparer<T>
Sie diese Option, wenn Sie eine andere Vergleichsmethode als den intrinsischen Vergleich der Klasse wünschen, sofern diese vorhanden ist.quelle
Es hängt von der Entität ab. Wenn Sie beispielsweise für eine Klasse wie "Student" folgen, ist es sinnvoll, IComparable basierend auf Name zu verwenden.
Aber wenn ein Lehrer 'A' Schüler basierend auf MathScore vergleichen möchte und Lehrer 'B' Schüler basierend auf EnglishScore vergleichen möchte. Es wird empfohlen, IComparer separat zu implementieren. (Eher wie ein Strategiemuster)
quelle
Es hängt alles davon ab, ob Ihr Typ veränderlich ist oder nicht. Sie sollten nur IComparable auf nicht-veränderbare Typen implementieren. Beachten Sie, dass Sie bei der Implementierung von IComparable Equals zusammen mit den Operatoren == ,! =, <und> überschreiben müssen (siehe Warnung CA1036 zur Codeanalyse).
Zitat von Dave G aus diesem Blog-Beitrag :
quelle
Einfache Erklärung über eine Geschichte
High School Basketball. Es ist eine Schulhofauswahl für die Teams. Ich möchte die größten / besten / schnellsten Leute in meinem Team haben. Was mache ich?
IComparer-Schnittstelle - Vergleichen Sie zwei Personen, die unterschiedliche Personen sind
Compare(Fred, John)
und es spuckt aus, wer besser ist.Was ist mit IComparable? - Vergleichen Sie sich mit jemand anderem
Warst du kürzlich auf FB? Sie sehen andere Leute, die coole Dinge tun: um die Welt reisen, Erfindungen kreieren, während ich etwas mache, das nicht ganz so cool ist - nun, wir nutzen die IComparable-Oberfläche.
Was ist mit der Vergleichsklasse?
Die Comparer-Klasse ist eine abstrakte Basisklasse, die die IComparer-Schnittstelle implementiert. Sie sollten von dieser Klasse ableiten, um eine konkrete Implementierung zu erhalten. Microsoft empfiehlt jedoch, dass Sie die Comparer-Klasse verwenden, anstatt die IComparer-Schnittstelle zu implementieren:
Zusammenfassung
Hoffe, die Geschichten helfen dir, dich zu erinnern.
quelle
Wie andere gesagt haben, tun sie nicht dasselbe.
Auf jeden Fall neige ich heutzutage dazu, IComparer nicht zu verwenden. Warum sollte ich? Seine Verantwortung (eine externe Entität, die zum Vergleichen von zwei Objekten verwendet wird) kann mit einem Lambda-Ausdruck viel sauberer gehandhabt werden, ähnlich wie die meisten Methoden von LINQ funktionieren. Schreiben Sie ein schnelles Lambda, das die zu vergleichenden Objekte als Argumente verwendet und einen Bool zurückgibt. Und wenn das Objekt seine eigene intrinsische Vergleichsoperation definiert, kann es stattdessen IComparable implementieren.
quelle
IComparable sagt, dass ein Objekt mit einem anderen verglichen werden kann. IComparer ist ein Objekt, das zwei beliebige Elemente vergleichen kann.
quelle
IComparer ist eine Schnittstelle, die zum Sortieren des Arrays verwendet wird. Diese Schnittstelle zwingt die Klasse, die Compare-Methode (T x, T y) zu implementieren, mit der die beiden Objekte verglichen werden. Die Instanz der Klasse, die diese Schnittstelle implementiert hat, wird bei der Sortierung des Arrays verwendet.
IComparable ist eine Schnittstelle, die in dem Typ implementiert ist, der die beiden Objekte desselben Typs vergleichen muss. Diese vergleichbare Schnittstelle zwingt die Klasse, die folgende Methode CompareTo (T obj) zu implementieren.
IEqualityComparer ist eine Schnittstelle, die verwendet wird, um das Objekt zu finden, unabhängig davon, ob es gleich ist oder nicht. Jetzt sehen wir dies in einem Beispiel, in dem wir den Unterschied eines Objekts in einer Sammlung finden müssen. Diese Schnittstelle implementiert eine Methode Equals (T obj1, T obj2).
Jetzt nehmen wir ein Beispiel, wir haben eine Employee-Klasse, basierend auf dieser Klasse müssen wir eine Sammlung erstellen. Jetzt haben wir die folgenden Anforderungen.
Sortieren Sie das Array mit der Array-Klasse 2. Benötigen Sie eine Sammlung mit Linq: Entfernen Sie das Duplikat, Ordnen Sie nach höher zu niedriger, Entfernen Sie eine Mitarbeiter-ID
öffentliche Klasse EmployeeIdSorter: IComparer {public int Compare (Mitarbeiter x, Mitarbeiter y) {if (x.Id <y.Id) return 1; sonst wenn (x.Id> y.Id) -1 zurückgibt; sonst 0 zurückgeben; }}
Weitere Informationen finden Sie unter http://dotnetvisio.blogspot.in/2015/12/usage-of-icomparer-icomparable-and.html
quelle