2016-03-19 23 views
1

Ich habe eine Customer-Klasse mit iComparable Interface erstellt.iComparable Interface-Funktionen

public class Customer: IComparable<Customer> 
{ 
    public int ID {set; get;} 
    public string Name {set; get;} 
    public int Salary {set; get;} 

    public int CompareTo(Customer obj) 
    { 
     if (this.Salary > obj.Salary) 
      return 1; 
     else if 
      (this.Salary < obj.Salary) 
      return -1; 
     else 
      return 0; 
    } 

} 

Im Hauptprogramm Ich habe eine Liste der Kunden erstellt und hinzugefügt drei Kunden.

List<Customer> ListCust = new List<Customer>(); 
ListCust.Add(Cust1); 
ListCust.Add(Cust2); 
ListCust.Add(Cust3); 

Ich sortiere dann die Liste.

ListCust.Sort(); 

Meine Frage ist, wie diese Art Methode der Liste ist die „CompareTo“ Teil der Customer-Klasse Abholung. Anfangs, als ich versucht hatte, es ohne die iComparable-Schnittstelle zu sortieren, gab es mir einen ungültigen Operationsfehler.

Die folgende Frage ist, warum kann ich nicht einfach eine "CompareTo" -Methode in der Kundenklasse ohne iComparable Schnittstelle machen und es funktionieren lassen?

Antwort

2

Der Grund, warum .NET Ihre Objekte Customer nicht "sortieren" konnte, ist, weil es keine Möglichkeit gibt, zu erraten, wie Sie sie sortieren wollen: nach Gehalt, nach Vorname, nach Nachname, nach der Zeit deren erster Ordnung usw.

Sie können jedoch ohne Umsetzung IComparable auf drei verschiedene Arten funktioniert:

  • Pass a separate IComparer<Customer> Implementierung - auf diese Weise können Sie eine Vergleichslogik in eine separate Klasse bewegen, und gelten andere Vergleichslogiken basierend auf einem Sit .
  • Pass a Comparison<Customer> Delegat - wie oben, aber jetzt brauchen Sie keine separate Klasse; Damit können Sie eine Vergleichslogik in einem Lambda bereitstellen.
  • Verwenden LINQ OrderBy statt - ähnlich wie oben, aber gibt Ihnen zusätzliche Fähigkeiten (Filterung, Projektierung, Gruppierung usw.)
+0

Vielen Dank. Für meine erste Frage, bin ich richtig, wenn ich sage, dass die Sortiermethode in der List-Auflistung nach einer Implementierung der CompareTo-Methode von iComparable sucht? – user3186277

+0

@ user3186277 Letztendlich, ja, obwohl es das nicht direkt tut. Es versucht, einen Standard-Vergleicher durch 'Comparer .Default' zu erhalten, der zuerst' IComparable 'versucht und dann für nicht-generische' IComparable' geht. Wenn beide Versuche fehlschlagen, löst sort eine Ausnahme aus. – dasblinkenlight

0

überprüfen Sie die Dokumentation auf MSDN der Sort Methode, heißt es

InvalidOperationException ausgelöst wird, wenn comparer ist null, und der Standardvergleich Comparer.Default nicht Umsetzung der IComparable generischen Schnittstelle oder die IComparable-Schnittstelle finden kann, Typ T.

Es wurde auf diese Weise entworfen.

2

Die Sort Methode überprüft, ob der Typ-Parameter IComparable implementiert. Wenn dies der Fall ist, wandelt die Methode jeden Eintrag in der Liste in IComparable um. Etwas wie folgt aus: (. Könnte nicht sein, wie sie tatsächlich es tat, aber Sie erhalten die Idee)

foreach (T item in this) { 
    if (item is IComparable) { 
     var castedItem = (IComparable)item; 
     // do other things with castedItem 
    } else { 
     throw new InvalidOperationException("Sorting is not supported"); 
    } 
} 

Also, wenn Sie nicht IComparable implementieren, item is IComparable falsch ergibt, so ist das, warum ein InvalidOperationException geworfen .

So ist der ultimative Grund ...

Der Quellcode überprüft nicht, ob Sie eine CompareTo Methode haben oder nicht. Es prüft nur, ob Sie die Schnittstelle implementiert haben.