Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - TList<T>.Sort vs. TList.SortList
Nersgatt - Di 24.04.12 10:07
Titel: TList<T>.Sort vs. TList.SortList
Moin,
ich hab kein Problem - ich möchte nur wissen, wo der Vorteil liegt.
Bei der alten Klasse TList kann ich dafür sorgen, dass Sie nach meinen Kriterien sortiert wird, indem ich eine eigene Function implementiere, die die Werte vergleicht. Diese Function übergebe ich an TList.SortList(const Compare: TListSortCompareFunc). Fertig ist der Lack.
Nun wollte ich das selbe bei einer TList<T> machen. Dort funktioniert es etwas anders. Ich muss für den Vergleich eine Klasse erstellen, die IComparer implementiert (bzw. halt von TComparer<T> ableiten). Dort überschreibe ich die Function Compare.
Um nun die Liste zu sortieren, muss ich eine Instanz vom Comparer erzeugen und an TList<T>.Sort übergeben.
Warum hat Embarcadero das gemacht? Die alte Methode ist aus meiner Sicht doch viel einfacher.
alt:
1. Function erstellen.
2. Referenz auf die Function übergeben
das war es.
neu:
1. Klasse ableiten
2. Function überschreiben
3. Instanz des Comparer erstellen
4. Instanz an TList<T>.Sort übergeben
5. Instanz vom Comparer wieder freigeben.
Deutlich mehr Quellcode, mehr Aufwand, keinen offensichtlichen Vorteil. :nixweiss:
Warum hat man es dann so gemacht?
Danke!
jaenicke - Di 24.04.12 11:14
Nersgatt hat folgendes geschrieben : |
neu:
1. Klasse ableiten
2. Function überschreiben
3. Instanz des Comparer erstellen
4. Instanz an TList<T>.Sort übergeben
5. Instanz vom Comparer wieder freigeben.
Deutlich mehr Quellcode, mehr Aufwand, keinen offensichtlichen Vorteil. :nixweiss:
Warum hat man es dann so gemacht? |
Warum hast
du es denn so gemacht? :P
Ich mache das lieber so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| var MyList: TList<TMyType>; begin ... MyList.Sort(TComparer<TMyType>.Construct( function (const ALeft, ARight: TMyType): Integer begin Result := ...; end )); |
Nersgatt - Di 24.04.12 11:25
Lol. Vermutlich, weil ich den anonymen Krams noch nicht wirklich auf dem Schirm hab. Würde aber ja auch bei TList funktionieren:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| var l : TList; begin
l := TList.Create; try
l.SortList(function (Item1, Item2: Pointer): Integer begin result := ...; end );
finally l.Free; end;
end; |
Trotzdem finde ich es bei TList<T> umständlicher und kann keinen Vorteil im Vergleich um alten System entdecken. :nixweiss:
jaenicke - Di 24.04.12 11:58
Es gibt dort z.B. für viele Typen auch schon vorgefertigte Vergleichsroutinen. Die kannst du so auf dem selben Weg benutzen:
Delphi-Quelltext
1: 2: 3: 4: 5:
| var MyList: TList<Integer>; begin ... MyList.Sort(TComparer<Integer>.Default); |
Das Interface kann man auch einfach aus einer DLL holen, zwischenspeichern, usw.
Warum der alte Weg nicht zusätzlich noch geht, weiß ich auch nicht, aber ich kann an dem neuen auch nix Schlechtes finden.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!