TObjectList<T>
以下に示す比較関数コードを独自の比較関数を使用して並べ替えたいと思います。
これを達成するために、ObjectList から昇順と降順の 2 方向に並べ替えることができるようにしたいのですが、これを行うには、S1 と S2 の 2 つのパラメーターを持つ SysUtil.CompareText を使用します。別の解決策が存在するかどうかはわかりません。s1がS2より大きい場合、またはその逆の場合はすべて問題ありませんが、通常の場合、s1 = s2の場合、列のすべての要素は同一ですが、反対が発生したため、リストに再インデックスはありません TObjectList sortedあたかも s1 > s2 または s1 < s2..
私の質問は、等値と差をサポートする比較子をどのように実装するかです。
TPerson = class
private
FName: string;
FId: string;
public
property Name: string read FName write FName;
property ID: string read FID write FID;
end;
TPersons = class(TObjectList<TPerson>)
public
constructor Create();
procedure Sort(Direction: string); reintroduce;
end;
procedure TForm4.Button1Click(Sender: TObject);
var
PersonsList: TPersons;
I: Integer;
begin
PersonsList := TPersons.Create;
PersonsList.Sort('Ascending');
for I := 0 to PersonsList.Count - 1 do
ShowMessage(PersonsList[i].Name);
end;
{ TPersons }
constructor TPersons.Create;
var
Person: TPerson;
begin
Person := TPerson.Create;
Person.Name := 'fateh';
Person.ID := '1';
Self.Add(Person);
Person := TPerson.Create;
Person.Name := 'mohamed';
Person.ID := '1';
Self.Add(Person);
Person := TPerson.Create;
Person.Name := 'oussama';
Person.ID := '1';
Self.Add(Person);
// all ids are identical
end;
procedure TPersons.Sort(Direction: string);
var
Comparer : IComparer<TPerson>;
Comparison : TComparison<TPerson>;
begin
if Direction = 'Ascending' then
Comparison := function(const Person1, Person2 : TPerson): Integer
begin
result := CompareText(Person1.ID, Person2.ID);
end;
if Direction = 'Descending' then
Comparison := function(const Person1, Person2 : TPerson): Integer
begin
result := - CompareText(Person1.ID, Person2.ID);
end;
Comparer := TComparer<TPerson>.Construct(Comparison);
inherited Sort(Comparer);
end;