我想TObjectList<T>
使用我自己的比较器函数对下面显示的比较器函数代码进行排序。
我希望我的 ObjectList 能够在升序和降序两个方向上进行排序以实现这一点,我使用具有两个参数 S1 和 S2 的 SysUtil.CompareText 并以降序方式排序,我正好与 CompareText 结果的符号相反。我不知道是否存在另一种解决方案,如果 s1 大于 S2 则一切都很好,反之亦然,但是如果 s1 = s2 在正常情况下,列表中没有重新索引,因为列中的所有元素都是相同的,但是相反的发生 TObjectList 排序列表好像 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;