![]() |
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 |
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 ); |
AW: Generics TList<> sortieren
Danke, hat geklappt.
|
AW: Generics TList<> sortieren
PS: Es gibt auch schon was Fertiges:
Delphi-Quellcode:
Aber wenn, dann kann es nie schaden, wenn man die "korrekten" Typen und passende Konstanten verwendet.
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
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 |
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:
Schöner wär natürlich, wenn TList<T> direkt ein Sort overload mit TComparison<T> hätte...
TestList.Sort(IComparer<TDataItem>(
function(const L, R: TDataItem): Integer begin Result := CompareValue(L.Modified, R.Modified); end)); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz