Autor Beitrag
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Di 24.04.12 10:07 
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!

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 24.04.12 11:14 
user profile iconNersgatt hat folgendes geschrieben Zum zitierten Posting springen:
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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: 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:
ausblenden 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:

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
ausblenden 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.