Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Generics TList<> sortieren (https://www.delphipraxis.net/189770-generics-tlist-sortieren.html)

Shark99 19. Jul 2016 12:30

Generics TList<> sortieren
 
Ich versuche mit Delphi Xe5 eine generische Liste zu sortieren und bekomme vom Compiler die Fehlermeldung:

[dcc32 Error] SortUnit.pas(255): E2035 Not enough actual parameters

Was mache ich falsch?
Delphi-Quellcode:
type

  TDataItem = class
    Modified: int64;
    Data: string;

    Constructor Create(iModified: int64; sData: string);
  end;

var

  TestList: TList<TDataItem>;

  ListModifiedComparer: IComparer<TDataItem>;
 
...

  ListModifiedComparer := TDelegatedComparer<TDataItem>.Construct(
                          function(const L,R:TDataItem): integer;
                          begin
                              Result := 0;
                              if (L.Modified > R.Modified) then Result := 1
                              else if (L.Modified < R.Modified) then Result := -1;
                          end;
                          );
                         
 TestList.Sort(ListModifiedComparer); // Zeile 255

bra 19. Jul 2016 12:33

AW: Generics TList<> sortieren
 
Versuchs mal mit TDelegatedComparer<TDataItem>.Create statt Construct.

und ich meine die ; in der inneren Function dürfen nicht sein (kann mich aber täuschen):

Delphi-Quellcode:
ListModifiedComparer := TDelegatedComparer<TDataItem>.Create(
                          function(const L,R:TDataItem): integer
                          begin
                              Result := 0;
                              if (L.Modified > R.Modified) then Result := 1
                              else if (L.Modified < R.Modified) then Result := -1;
                          end
                          );

Shark99 19. Jul 2016 12:37

AW: Generics TList<> sortieren
 
Danke, hat geklappt.

himitsu 19. Jul 2016 12:59

AW: Generics TList<> sortieren
 
PS: Es gibt auch schon was Fertiges:
Delphi-Quellcode:
function(const L, R: TDataItem): Integer
begin
  Result := CompareValue(L.Modified, R.Modified); // oder CompareStr/CompareText
end

// lässt sich auch verschachteln
function(const L, R: TDataItem): Integer
begin
  Result := CompareValue(L.Modified, R.Modified);
  if Result = 0 then
    Result := CompareValue(L.WasAnderes, R.WasAnderes);
  if Result = 0 then
    ...
end
Aber wenn, dann kann es nie schaden, wenn man die "korrekten" Typen und passende Konstanten verwendet.
Delphi-Quellcode:
function(const A, B: xxxx): TValueRelationship;
begin
  if A = B then //if SameValue(A, B, Epsilon) then
    Result := EqualsValue
  else if A < B then
    Result := LessThanValue
  else
    Result := GreaterThanValue;
end

function(const A, B: xxxx): TValueRelationship;
begin
  Result := EqualsValue;
  if A < B then
    Result := LessThanValue
  else if A > B then
    Result := GreaterThanValue;
end

Stevie 25. Jul 2016 14:35

AW: Generics TList<> sortieren
 
Man kann auch einen kleinen Trick nutzen.

Da TComparison<T> und IComparer<T> binärkompatibel sind, kann man die anonyme Methode direkt hardcasten:

Delphi-Quellcode:
TestList.Sort(IComparer<TDataItem>(
  function(const L, R: TDataItem): Integer
  begin
    Result := CompareValue(L.Modified, R.Modified);
  end));
Schöner wär natürlich, wenn TList<T> direkt ein Sort overload mit TComparison<T> hätte...


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz