Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi TObjectList und CustomComparer (https://www.delphipraxis.net/204965-tobjectlist-und-customcomparer.html)

Benmik 17. Jul 2020 22:38

TObjectList und CustomComparer
 
Ich habe folgende Klassen:
Delphi-Quellcode:
TObjX = class(TObject
  MD5 : integer;
end;

TObjXListe = class(TObjectList<TObjX>)
  private
    function VergleicheMD5(const L,R:TObjX):Integer;
  public
    procedure Sort;
end;

procedure TObjXListe.Sort;
begin
  inherited Sort(TComparer<TObjX>.Construct(Self.VergleicheMD5));
end;
Das funktioniert.

Nun habe ich aber folgende Klasse:
Delphi-Quellcode:
TKlasseX = class(TObject)
  ObjXListe : TObjectList<TObjX>;  
end;
Wie sortiere ich jetzt diesmal die TObjectList<TObjX> mit einem Custom Comparer? Prinzipiell bekäme ich das schon hin, es gibt mehrere Lösungen, aber ich hätte es gern so konzise wie
Delphi-Quellcode:
inherited Sort(TComparer<TObjX>.Construct(Self.VergleicheMD5)).
Alle Versuche, diese Zeile so zu modifizieren, dass sie klappt, schlugen fehl.
Und auch folgende Prozedur blieb immer hängen:
Delphi-Quellcode:
procedure TKlasseX.SortiereNachMD5;
begin
  ObjXListe.Sort(
  TComparer<TObjX>.Construct(
    function(const L,R: TObjX): Integer
    begin
      Result := L.MD5 - R.MD5;
    end))
end;
Und zwar nach dem ersten
Delphi-Quellcode:
end
mit der Begründung: Fehler 2480: Inkompatible Typen: 'System.Generics.Defaults.TComparison<Modulxyz.TOb jX>' und 'Procedure'.
Kann mich da jemand erleuchten?

Uwe Raabe 18. Jul 2020 09:16

AW: TObjectList und CustomComparer
 
Sollte das nicht
Delphi-Quellcode:
TObjX
heißen?
Delphi-Quellcode:
TComparer<ObjX>.Construct(

Benmik 18. Jul 2020 13:12

AW: TObjectList und CustomComparer
 
Das war leider nur ein Übertragungsfehler, den ich korrigiert habe. Im Original stand das "T" dabei.

Klaus01 18. Jul 2020 14:00

AW: TObjectList und CustomComparer
 
sollte der TComparer nicht 1 oder -1 oder 0 zurückgeben?
Für größer, kleiner und gleich?

Grüße
Klaus

himitsu 18. Jul 2020 14:02

AW: TObjectList und CustomComparer
 
Ja+Nein

Ist wie mit dem Boolean
True = 1, bei der Konstante,
aber <>0 = True, bei der Auswertung.

0, Kleiner oder Größer,
allerdings MD5 sollte doch auch Werte größer als Integer liefern?

Benmik 18. Jul 2020 14:56

AW: TObjectList und CustomComparer
 
Ich habe jetzt mal den Code in der geposteten Minimalform in ein neues Projekt eingefügt und er kompiliert. Da muss etwas anderes dahinter stecken. Ich versuche, es herauszukriegen.

Gibt es eine Version mit dem inherited, die funktionieren würde?

Stevie 18. Jul 2020 16:53

AW: TObjectList und CustomComparer
 
Da du eh deine eigene Klasse von
Delphi-Quellcode:
TObjectList<TObjX>
ableitest, schreib nen Konstruktur und übergib einfach den comparer ans inherited Create und spar dir das bei jedem Sort Aufruf

Benmik 18. Jul 2020 19:03

AW: TObjectList und CustomComparer
 
Man wird es vermutlich nicht glauben, aber das Problem saß mal wieder vor dem Schirm. Ich hatte extra eine etwas abstrahierte Form meines Codes gepostet anstatt des Originalcodes. Wie immer hätte ich das nicht tun sollen, denn dann wäre der Fehler sofort gefunden worden.
Im Originalcode hatte ich statt
Delphi-Quellcode:
procedure TKlasseX.SortiereNachMD5;
begin
  ObjXListe.Sort(
  TComparer<TObjX>.Construct((
Delphi-Quellcode:
procedure TKlasseX.SortiereNachMD5;
begin
  ObjXListe.Sort(
  TComparer<TKlasseX>.Construct(
geschrieben, was dort (anders als hier im Beispiel) sehr ähnlich war. Wie blöd. Vielen Dank jedenfalls an alle Hilfsbereiten. (Interessant, dass hier der Fettdruck versagt.)

Benmik 18. Jul 2020 19:06

AW: TObjectList und CustomComparer
 
Zitat:

Zitat von Stevie (Beitrag 1469841)
... übergib einfach den Comparer ans inherited Create..

Ja, finde ich auch sehr elegant, aber ich habe zwei Sortierroutinen. Ich könnte einen Parameter einführen, aber für nur zwei Sortierfunktionen lohnt das nicht. An der eingangs zitierten Stelle habe ich das so gemacht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:16 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