Użyj listy generycznej – ta powinna mieć metodę Sort
, której podaje się funkcję porównującą dwa elementy (u Ciebie rekordy) i zwracającą liczbowy wynik. Jeśli o sortowanie macierzy chodzi, to raczej będziesz musiał sam wszystko napisać.
Niestety nie mam Delphi, więc mogę co najwyżej podać kod napisany w Lazarusie, w trybie zgodności z tym pierwszym. No i nie wiem jak w Delphi, ale Lazarus wymusza zdefiniowanie operatora porównania dla rekordu, więc jego definicja może nie być konieczna.
{$MODE DELPHI}{$LONGSTRINGS ON}{$INLINE ON}{$MODESWITCH ADVANCEDRECORDS}
uses
Math, FGL;
type
TCategory = record
public
Index: Integer;
Parent: Integer;
Name: String;
FullCategory: String;
public
class operator = (const ALeft, ARight: TCategory): Boolean; inline; // to może nie być konieczne
class function Compare(const ALeft, ARight: TCategory): Integer; static;
end;
class operator TCategory. = (const ALeft, ARight: TCategory): Boolean;
begin
Result := (ALeft.Index = ARight.Index) and (ALeft.Parent = ARight.Parent) and
(ALeft.Name = ARight.Name) and (ALeft.FullCategory = ARight.FullCategory);
end;
class function TCategory.Compare(const ALeft, ARight: TCategory): Integer;
begin
Result := Math.CompareValue(ALeft.Index, ARight.Index); // przykładowe porównanie
end;
var
Categories: TFPGList<TCategory>;
begin
Categories := TFPGList<TCategory>.Create();
try
Categories.Sort(@TCategory.Compare); // tu automat sortuje quick sortem
finally
Categories.Free();
end;
end.
To tylko przykład, więc nie traktuj go jako gotowca.