Einzelnen Beitrag anzeigen

Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: TObjectList<T> und Comparer

  Alt 27. Jan 2015, 14:51
Richtig- In Sachen Vererbung ist das ja im Endeffekt auch nichts anderes: Du rufst evtl. ein THund.Create() auf und weist das einer TTier -Variable zu. Alles klar soweit in Sachen Interfaces? Das Sortieren mit IComparer<T> und allem ist da schon viel knackiger, finde ich.

Die Doku ist inhaltlich oft falsch, der Kram hinter der F1-Taste nicht zu gebrauchen. Der tatsächliche Inhalt zu System.Generics.Defaults.TComparer.Compare ist aber hier ausnahmsweise sehr brauchbar, finde ich.

Hier mal ein Beispiel mit Integern:

Delphi-Quellcode:
program Project19;

{$APPTYPE CONSOLE}

{$R *.res}

uses System.SysUtils, System.Generics.Collections, System.Generics.Defaults;

type
   /// <summary>
   /// Vergleicht <c>Integer</c>, jedoch in <b>absteigender</b> Reihenfolge:
   /// Für diesen Comparer ist <c>5 &gt; 42</c>
   /// </summary>
   TMyReversedIntegerComparer = class(TComparer<Integer>)
      function Compare(const Left, Right: Integer): Integer; override;
   end;

procedure justSortingThings();
var
   myList:            TList<Integer>;
   descendingComparer: IComparer<Integer>;
   item:            Integer;
begin
   myList := TList<Integer>.Create();
   myList.AddRange([5, 42, 5, 99, -37]);

   WriteLn('Normales Sortierverhalten: ');
   myList.Sort();
   for item in myList do WriteLn(item);

   WriteLn(sLineBreak);

   WriteLn('Mein eigenes Sortierverhalten: ');
   descendingComparer := TMyReversedIntegerComparer.Create();
   myList.Sort(descendingComparer);
   for item in myList do WriteLn(item);

   myList.Destroy();
end;


{ TMyReversedIntegerComparer }

function TMyReversedIntegerComparer.Compare(const Left, Right: Integer): Integer;
begin
   Result := -(Left - Right);
end;

begin
  try
   ReportMemoryLeaksOnShutdown := True;
   justSortingThings();
  except
   on E: Exception do
     Writeln(E.ClassName, ': ', E.Message);
  end;
  readln;
end.
Ich persönlich würde es auch mit einer anonymen Methode machen aber im Endeffekt ist es das gleiche.
  Mit Zitat antworten Zitat