Generische Listen in Delphi

Delphi bietet seit Delphi 2009 ähnlich wie z.B. in Java auch die Möglichkeit, generische Typen zu verwenden. Diese ermöglichen es, Klassen und Methoden zu schreiben, welche mit einen Typparameter parametrisiert werden, um Typsicherheit trotz generischer Programmierung zu ermöglichen.

Ein einfaches Beispiel dafür sind Listen. Musste man früher für jeden Datentyp eine eigene Listenklasse entwickeln, kann man dies nun so formulieren, dass die Listenklasse nur einmal entwickelt werden muss und erst wenn das konkrete Listenobjekt erzeugt wird, entscheidet sich von welchem Datentyp die Liste ist.

Delphi bietet in seiner Bibliothek Generics.Collections bereits diverse generische Listenklassen an, von der wir uns die TList-Klasse ansehen wollen.

Nehmen wir an wir haben eine Klasse TMitarbeiter:

interface

type
  TMitarbeiter = class(TObject)
  private

  public
    id: integer;
    vorname: string;
    nachname: string;
end;

implementation

end.

Wollen wir nun eine Liste mit allen Mitarbeitern erstellen, könnten wir diese folgendermaßen deklarieren und befüllen:

function getMitarbeiterList: TList<Mitarbeiter>;
var mitarbeiterList: TList<TMitarbeiter>;
    mitarbeiter: TMitarbeiter;
begin
    mitarbeiterList := TList<TMitarbeiter>.create;

    // Beispiel-Mitarbeiter anlegen
    mitarbeiter1 := TMitarbeiter.create;
    mitarbeiter1.id := 1;
    mitarbeiter1.vorname := 'Anton';
    mitarbeiter1.nachname := 'Fischer';

    // Mitarbeiter der Liste hinzufügen
    mitarbeiterList.add(mitarbeiter1);

    result := mitarbeiterList;
end;
Code-Sprache: PHP (php)

Um in der Liste alle Mitarbeiter durchzugehen, kann man folgende Schleife erstellen:

var mitarbeiter: TMitarbeiter;
begin
    for mitarbeiter in mitarbeiterList do begin
        // etwas mit mitarbeiter machen
    end;
end;
Code-Sprache: JavaScript (javascript)

Generische Liste benutzerdefiniert sortieren

Um die Liste zu sortieren, kann man die Funktion sort verwenden, welcher man eine eigene Vergleichsfunktion mit einer Klasse vom Typ TComparer übergibt. Hierzu muss man vorher noch die Bibliothek Generics.Defaults einbinden.

Beispiel: Sortieren unserer Mitarbeiter-Liste nach Nachnamen

uses Generics.Collections, Generics.Defaults, ……;

procedure SortiereMitarbeiter(mitarbeiterList: TList<TMitarbeiter>);
begin
    mitarbeiterList.Sort(TComparer<TMitarbeiter>.Construct(
            function( const left, right: TMitarbeiter): integer
            begin
                result := CompareText(left.nachname, right.nachname);
            end
        )
    );

end;Code-Sprache: PHP (php)

Schreibe einen Kommentar