【发布时间】:2013-02-12 09:06:40
【问题描述】:
我想使用我自己的比较器函数对TObjectList<T>进行排序,比较器函数代码如下所示。
我希望我的 ObjectList 能够在升序和降序两个方向上进行排序以实现此目的我使用具有两个参数 S1 和 S2 的 SysUtil.CompareText 并以降序方式排序我正好与 CompareText 的符号相反结果。我不知道是否存在另一种解决方案,如果 s1 大于 S2,则一切都很好,反之亦然,但是如果 s1 = s2 在正常情况下,列表中没有重新索引,因为列中的所有元素都是相同的,但相反 发生 TObjectList 对列表进行排序,好像 s1 > s2 或 s1
我的问题是如何实现支持相等和差异的比较器?
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;
【问题讨论】:
-
顺便说一句,您确定“字符串”是 Direction 参数的最佳选择吗?
-
不,不是代码只是为了说明......
-
您的比较函数正确报告列表中的所有项目都是相等的。当它们都相等时,为什么它们的顺序很重要?也许你需要研究的主题是稳定排序。
-
我无法理解这个问题。你有什么问题?
-
如果 tobjectlist 对 id 字段进行排序,我不只有 id 字段,而且不应该使 name 字段也排序 Arioch '比我更好的解释感谢所有成员......跨度>
标签: delphi generics sorting tobjectlist