28 Gäste und 0 Benutzer online | Anmelden | Registrieren


Designelement Startseite

Designelement Windows-Artikel
  Designelement Problemlösungen
  Designelement Einstellungen
  Designelement Anleitungen
  Designelement Hardware
  Designelement FAQ
  Designelement C#.NET

Designelement Forum
Designelement Gästebuch

Designelement Programme
  Designelement Onlinetools
  Designelement Downloads

Designelement Suche
Designelement Links

Designelement Impressum
Designelement Kontakt

Designelement Anmelden





Zu den C#.NET-Artikeln

  Sortieren von Listen II - C#
Am 10.10.2007 verfasst von Andreas Nägeli. Hits: 489

Im letzten Artikel haben wir eine Liste sortiert, indem wir in die Liste Objekte geschrieben haben, die wissen, wie sie zu sortieren sind. Dies geschah über das Interface IComparable.

Diese Art von Sortierung hat den Nachteil, dass man in der Regel nur nach einem Kriterium sortieren kann. Praktischer wäre es, wenn man ein unabhängiges Objekt zur Verfügung hätte, dass weiß, wie zwei Objekte eines Datentyps zu sortieren sind. Man könnte dann je nach Kriterium eine andere Klasse oder Instanz als Sortiervorgabe wählen. Diese Möglichkeit wird mit dem Interface IComparer<> implementiert.

Zunächst einmal benötigen wir wieder eine Datenklasse als Beispiel.

public class Person {
  private String Vorname, Nachname;
  private int Alter;

  public Person(String Vorname, String Nachname, int Alter) {
    this.Vorname = Vorname;
    this.Nachname = Nachname;
    this.Alter = Alter;
  }

  public String getVorname() { return Vorname; }
  public String getNachname() { return Nachname; }
  public int getAlter() { return Alter; }
}


Wieder wird das Objekt beim Erstellen über den Konstruktor initialisiert und kann über die get-Methoden ausgelesen werden.

Die eigentliche Sortiertlogik befindet sich nun ausgelagert in zwei verschiedenen Klassen, die nach verschiedenen Kriterien sortieren sollen. Eine nach Alter, die andere nach Vorname.

public class SortByAlter : IComparer {

  public int Compare(Person eins, Person zwei) {
    return eins.getAlter() - zwei.getAlter();
  }
}


Zunächst ist wichtig, dass diese Klasse das Interface IComparer implementiert. Daraus folgt, dass wir nur Personen vergleichen können und nicht z.B. Äpfel und Birnen. Das Interface erzwingt die Methode Compare, mit der zwei Objekte des Typs Person verglichen werden sollen. Die Logik funktioniert ähnlich wie bei der CompareTo-Methode. Ist der Wert des ersten Objekts größer, so kommt bei der Rechnung eine positive Zahl heraus, sonst eine Negative beziehungsweise eine Neutrale (0).

Eine zweite Klasse SortByVorname soll die Liste nach den Vornamen sortieren:

public class SortByVorname : IComparer {

  public int Compare(Person eins, Person zwei) {
    return eins.getVorname().CompareTo(zwei.getVorname());
  }
}


Hier nutzen wir aus, dass es die CompareTo-Methode bei Strings bereits gibt. Wir müssen sie nur noch mit den richtgen Parametern füttern. Wichtig ist hier, dass die Reihenfolge (eins mit zwei vergleichen, nicht umgekehrt) eingehalten werden muss.

Wie benutzen wir diese Klassen jetzt? Nun, die Sort-Funktion der Liste, die wir im ersten Teil bereits verwendet haben, ist überladen. Als Parameter kann ein Objekt des Typs IComparer verwendet werden. Damit ist es möglich, unsere Sortierklassen einzusetzen.

Mit diesem Programm können wir die funktionsweise nachvollziehen:

static void Main(string[] args) {
  List list = new List();
  list.Add(new Person("Andreas", "Nägeli", 20));
  list.Add(new Person("Max", "Mustermann", 18));
  list.Sort(new SortByAlter());
  foreach (Person p in list)
    Console.WriteLine(p.getNachname());
  list.Sort(new SortByVorname());
  foreach (Person p in list)
    Console.WriteLine(p.getNachname());
}


Zunächst füllen wir die Liste mit den zwei Einträgen vom letzten mal. Dann lassen wir die Liste erst nach Alter (mit einer neuen SortByAlter-Instanz) und danach nach den Vornamen sortieren (SortByVorname).

Es wäre auch möglich, nur ein Objekt zu verwenden, dessen Sortierungsmodus geändert werden kann.

Kommentiertes Codebeispiel herunterladen (CLSortII.rar, 16 KB, VS80)

Bewertung dieses Artikels von 3 Benutzern: Mit 10 von 10 Punkten bewertet - 10 / 10 Punkte

Wie finden Sie diesen Artikel?











  2002 - 2008 Designelement Computerleben.net Designelement Sitemap