Frage

Ich versuche, ich brauche welche diese Schnittstellen, um herauszufinden, zu implementieren. Sie beide im Wesentlichen das gleiche tun. Wann würde ich einen über den anderen verwenden?

War es hilfreich?

Lösung

Nun sind sie nicht ganz das Gleiche wie IComparer<T> an einem Typ implementiert, die beim Vergleich von zwei verschiedenen Objekten der Lage ist, während IComparable<T> auf Arten implementiert die in der Lage sind, sich selbst zu vergleichen mit anderen Instanzen der gleicher Typ.

Ich neige dazu, IComparable<T> für Zeiten zu verwenden, wenn ich wissen müssen, wie eine andere Instanz Instanz this bezieht. IComparer<T> ist nützlich für die Sammlungen Sortierung als die IComparer<T> außerhalb des Vergleichs steht.

Andere Tipps

Verwenden IComparable<T>, wenn die Klasse einen intrinsischen Vergleich hat.

IComparer<T> Verwenden Sie, wenn Sie eine Vergleichsmethode andere als die Klasse wollen intrinsischen Vergleich, wenn sie eine hat.

Es hängt von der Einheit. Zum Beispiel für eine Klasse folgenden wie „Student“, wird es sinnvoll IComparable zu haben, basierend auf Namen.

class Student : IComparable 
{
    public string Name { get; set; }
    public int MathScore { get; set; }
    public int EnglishScore { get; set; }

    public int TotalScore 
    {
        get
        {
            return this.MathScore + this.EnglishScore; 
        }
    }

    public int CompareTo(object obj)
    {
        return CompareTo(obj as Student);  
    }

    public int CompareTo(Student other)
    {
        if (other == null)
        {
            return 1;
        }
        return this.Name.CompareTo(other.Name);  
    }
}

Aber wenn ein Lehrer ‚A‘ will Studenten vergleichen basiert auf MathScore und Lehrer ‚B‘ will Studenten vergleichen, basierend auf EnglishScore. Es wird eine gute Idee sein, separat zu implementieren IComparer. (Mehr wie ein Strategie-Muster)

class CompareByMathScore : IComparer<Student>
{
    public int Compare(Student x, Student y)
    {
        if (x.MathScore > y.MathScore)
          return 1;
        if (x.MathScore < y.MathScore)
          return -1;
        else
          return 0;
    }
}

Es hängt alles davon ab, ob Ihr Typ ist wandelbar oder nicht. Sie sollten nur implementieren IComparable auf nicht-veränderbare Typen. Beachten Sie, dass, wenn Sie IComparable implementieren, müssen Sie Equals überschreiben, zusammen mit dem ==,! =, Operatoren (siehe Code-Analyse-Warnung CA1036).

Zitiert Dave G von diesem Blog-Eintrag :

  

Aber die richtige Antwort ist IComparer statt IComparable zu implementieren, wenn Ihre Objekte sind wandelbar, und übergeben Sie eine Instanz der IComparer zu Sortierfunktionen, wenn notwendig.

     

Da die IComparer nur ein Einweg-Objekt wird verwendet, um zu diesem Zeitpunkt sortieren, können Sie Ihr Objekt hat keine wandelbare Semantik Sie wünschen. Darüber hinaus ist es nicht erforderlich oder sogar vorschlagen, mit Equals, GetHashCode oder == -. Sie sind frei, sie in irgendeiner Weise definieren Sie bitte

     

Schließlich können Sie für die Sortierung auf verschiedenen Feldern oder mit unterschiedlichen Regeln mehrere IComparer die für Ihre Art definieren. Das ist viel flexibler als mit einer Definition stecken.

     

Kurz gesagt:. Verwenden Sie IComparable für Werttypen und IComparer für Referenztypen

Einfache Erklärung über eine Geschichte

High-School-Basketball. Es ist ein Schulhof Pick für die Teams. Ich mag die höchst / besten / schnellst Leute in meinem Team zu bekommen. Was kann ich tun?

IComparer Schnittstelle - Vergleichen Sie zwei Menschen trennen Menschen

  • Dies ermöglicht es mir, alle zwei Jungs aufgereiht vergleichen ......... das ist es im Grunde. Fred vs John .......... ich werfe sie in eine konkrete Klasse, die die Schnittstelle implementiert. Compare(Fred, John) und es spuckt, der besser ist.

Was ist IComparable - Vergleichen Sie sich mit jemand anderem

Haben Sie kürzlich auf FB gewesen? Sie sehen andere Leute coole Dinge zu tun. Die Welt zu reisen, Erfindungen zu schaffen, während ich etwas zu tun, bin nicht ganz so cool - gut, was wir tun Nutzung der IComparable-Schnittstelle macht

  • Wir vergleichen die aktuelle Instanz (selbst) mit einem anderen Objekt (jemand anderes), die von der gleichen Art ist (Person).

Was ist mit der Comparer-Klasse?

Die Comparer-Klasse ist eine abstrakte Basisklasse, die den IComparer-Schnittstelle implementiert. Sie sollten von dieser Klasse leiten eine konkrete Umsetzung zu haben. Wie auch immer, empfiehlt Microsoft, dass Sie die Comparer-Klasse verwenden Sie statt die IComparer-Schnittstelle zu implementieren:

  

Wir empfehlen, dass Sie von der Comparer-Klasse abgeleitet werden, anstatt die IComparer-Schnittstelle zu implementieren, da die Comparer-Klasse einer explizite Schnittstellenimplementierung der IComparer.Compare Methode und der Standardeigenschaft bereitstellt, die den Standardvergleich für das Objekt wird.

Zusammenfassung

  • IComparer - line up zwei Dinge und vergleichen
  • .
  • IComparable - vergleichen Sie sich mit anderen auf FB
  • .

Hoffe, dass die Geschichten helfen Sie sich erinnern.

Wie andere gesagt haben, sie die gleiche Sache nicht.

In jedem Fall, in diesen Tagen Ich neige dazu, nicht IComparer zu verwenden. Warum sollte ich? Seine Verantwortung (eine externe Einheit verwendet, um zwei Objekte zu vergleichen) kann viel sauberer mit einem Lambda-Ausdruck, ähnlich wie die meisten von LINQ Methoden unsachgemäß behandelt werden. Schreibe eine schnelle Lambda, die die Objekte als Argumente zu vergleichen, und gibt einen bool. Und wenn das Objekt seine eigene innere definiert Vergleichsoperation, kann es IComparable implementieren statt.

IComparable sagt ein Objekt mit einem anderen verglichen werden. IComparer ist ein Objekt, das alle zwei Artikel miteinander vergleichen kann.

IComparer ist eine Schnittstelle, die das Array zu sortieren, verwendet wird, wird diese Schnittstelle die Klasse zwingen, die zur Umsetzung Vergleichen (T x, T y) -Methode, die die beiden Objekte vergleichen. Die Instanz der Klasse, die diese Schnittstelle implementiert ist in der Sortierung des Arrays verwendet wird.

IComparable ist eine Schnittstelle in der Art durchgeführt wird, die die beiden Objekte des gleichen Typs vergleichen muss, wird diese vergleichbare Schnittstelle der Klasse zwingen die folgende Methode CompareTo (T obj)

zu implementieren

IEqualityComparer ist eine Schnittstelle, die verwendet wird, um das Objekt zu finden, ob er gleich ist oder nicht, jetzt werden wir dies in einer Probe sehen, wo wir die Distinct eines Objekts in einer Sammlung zu finden haben. Diese Schnittstelle wird ein Verfahren implementieren Equals (T obj1, T obj2)

Nun nehmen wir ein Beispiel wir eine Klasse Employee haben, auf der Grundlage dieser Klasse wir eine Sammlung erstellen haben. Jetzt haben wir die folgenden Anforderungen.

Sortieren Sie die Array Array-Klasse 2. eine Sammlung mit Linq brauchen: Entfernen Sie den doppelten, Sortieren nach höheren zu niedrigeren, Entfernen Sie eine Mitarbeiter-ID

abstract public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Address { set; get; }
}

public enum SortType
{
    ByID,
    BySalary
}

public class EmployeeIdSorter: IComparer         {             public int Vergleichen (Employee x, Mitarbeiter y)             {                 if (x.Id y.Id)                     -1 zurück;                 sonst                     return 0;             }         }

    public class EmployeeSalarySorter : IComparer<Employee>
    {
        public int Compare(Employee x, Employee y)
        {
            if (x.Salary < y.Salary)
                return 1;
            else if (x.Salary > y.Salary)
                return -1;
            else
                return 0;
        }
    }

Für weitere Informationen unter refere http://dotnetvisio.blogspot.in/2015/12 /usage-of-icomparer-icomparable-and.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top