Ich habe eine Klasse TAudioFile mit verschiedenen Eigenschaften, z.B. Artist, Titel, Album etc. (für diese Problemstellung hier alles nur Strings).
Jetzt stellt sich mir das Problem, dass ich eine Liste von solchen Objekten sortieren möchte, und zwar nicht nur nach einem Sortierkriterium, sondern nach mehreren, die der User zur Laufzeit festlegen kann. Also z.B. primäres Sortierkriterium: Artist. Bei Gleichheit: Sortierung nach Album, anschließend Sortierung nach Titel.
Wenn ich 10 Eigenschaften habe, müsste ich also 10*9 = 90 Compare-Funktionen für die Sort-Routine schreiben
, wenn ich zwei "Stufen" zulasse. Bei 3 Stufen (wie im Beispiel) 10*9*8 = 720....
Im
DF ist die
Idee aufgekommen, das damit zu lösen, alle Eigenschaften des Objektes in einem Array of String zu speichern, und in
einer Comparefunktion auf ein Sortier-Array zurückzugreifen, in dem die Indizes der Eigenschaften gespeichert sind, nach denen primär, sekundär, etc. sortiert wird.
Ist sicherlich ne schöne Sache, nur würde diese Lösung bedeuten, dass ich in einem recht umfangreichen Projekt alle ".Artist", ".Album" etc. durch ein ".EigenschaftenArray[CONST_ARTIST]" etc. ersetzen müsste (mit entsprechenden Konstanten CONST_ARTIST). Ein zusätzlicher großer Nachteil wäre auch, dass man Dinge wie Autovervollständigung in der
IDE zum schnelleren Finden der richtigen Eigenschaftsbezeichnung vergessen kann - der Code verliert an Übersichtlichkeit und Wartbarkeit.
Ich suche also eine Möglichkeit, wie ich die bisherige Struktur beibehalten kann, und sie um ein Array zu erweitern, sodass aber in den einzelnen Zellen des Arrays dieselben Infos stecken wie in den einzelnen Eigenschaften. Also so, dass ich
MyAudioFile.Artist
im Code völlig synonym zu
MyAudioFile.EigenschaftenArray[CONST_ARTIST]
verwenden kann. Dabei muss als Index auch eine Variable entsprechenden Wertes möglich sein - z.B.:
MyAudioFile.EigenschaftenArray[SortierPrioritätenArray[1]]
Eine simple Ersetzung vor dem Kompilieren ist also nicht möglich.