21 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 - C#
Am 09.10.2007 verfasst von Andreas Nägeli. Hits: 1684

Die Liste ist ein sehr wichtiger Datentyp zum kurzfristigen Speichern von Daten. Wenn man anhand einer Liste etwas ausgeben will, möchte man die Daten vorher eventuell sortieren. Doch dies stellt uns vor ein Problem: es kann eine Liste von jedem beliebigen Typ erstellt werden. Woher weiß die Liste, wie ein bestimmter Datentyp sortiert werden soll?

Die Lösung ist recht simpel. Es reicht, wenn ein Objekt an sich weiß, wann es "größer" oder "kleiner" wie ein anderes Objekt des gleichen Typs ist. Diese Eigenschaft wird mit dem Interface IComparable implementiert. Es fordert eine Methode mit der Signatur int CompareTo(Object). Diese Methode wird von der Sortierroutine der Liste aufgerufen, wenn die Liste geordnet werden soll. Gibt die Methode einen Wert kleiner 0 zurück, so ist das übergebene Objekt größer als das Objekt selbst. Genau 0 bedeutet Gleichheit, größer 0 bedeutet, dass das aufgerufene Objekt größer als die übergebene Instanz ist.

Das Ganze anhand einer Beispielklasse:

public class Person : IComparable {

  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 int CompareTo(Object o) {
    if (o is Person)
      return this.getAlter() - ((Person)o).getAlter();
    return 0;
  }

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

}


Über den Konstruktor werden die Datenvariablen gesetzt, die über die get-Methoden wieder abgerufen werden können.

Die Methode CompareTo prüft zunächst, ob das übergebene Objekt vom Typ Person ist. Wenn ja, so wird die Differenz zwischen dem eigenen Alter und dem Alter der übergebenen Person zurückgegegeben. Ist die eigene Person älter, so wird ein Wert größer 0 zurückgegegeben. Sind sie gleich alt, kommt eine 0 bei der Rechnung heraus. War die übergebene Variable nicht vom Typ Person, so geben wir eine 0 zurück, um uns in diesem Falle neutral zu verhalten.

Diese Klasse kann jetzt mit einem Beispielprogramm getestet werden.

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();
  foreach (Person p in list)
    Console.WriteLine(p.getNachname());
}


Zunächst erstellen wir eine neue Liste und füllen diese mit zwei Einträgen. Unsere Logik sollte die Datenstruktur aufsteigend nach Alter sortieren, so dass die Ausgabe nach list.Sort() mit "Mustermann" beginnen muss.

Diese Möglichkeit der Sortierung ist sehr einfach zu implementieren, da keine eigene Sortierungsroutine geschrieben werden muss. Die Vorgehensweise mit CompareTo macht nur Sinn, wenn die Objekte nur nach einem Kriterium sortiert werden müssen. Soll die Liste nach unterschiedlichen Gesichtspunkten sortiert werden (z.B. erst nach Alter, später dann nach Vorname), so muss mit IComparer gearbeitet werden.

Kommentiertes Codebeispiel herunterladen (CLSort.rar, 15 KB, VS80)

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

Wie finden Sie diesen Artikel?











  2002 - 2008 Designelement Computerleben.net Designelement Sitemap