Delphi &引用;“堆栈溢出”;泛型TList.Sort出错
我已经实现了Generics.Defaults.TComparer来对类型化的TList进行排序。但是,当调用Sort方法时,它会抛出一个异常“Stack overflow at…” 为什么会发生堆栈溢出错误Delphi &引用;“堆栈溢出”;泛型TList.Sort出错,delphi,delphi-10-seattle,tlist,Delphi,Delphi 10 Seattle,Tlist,我已经实现了Generics.Defaults.TComparer来对类型化的TList进行排序。但是,当调用Sort方法时,它会抛出一个异常“Stack overflow at…” 为什么会发生堆栈溢出错误 // Declarations TOrder = record ID: Integer; OrderDate: TDate; end; POrder = ^TOrder; FOrderList: TList<POrder>; TCom
// Declarations
TOrder = record
ID: Integer;
OrderDate: TDate;
end;
POrder = ^TOrder;
FOrderList: TList<POrder>;
TComparer_OrderDate = class(TComparer<POrder>)
public
function Compare(const a, b: POrder): Integer; override;
end;
function TComparer_OrderDate.Compare(const a, b: POrder): Integer;
begin
Result := 0;
if (a^.OrderDate> b^.OrderDate) then
Result := 1
else
Result := -1;
end;
// This code inside a button OnClick event:
FOrderList := TList<POrder>.Create;
FComparer_OrderDate := TComparer_OrderDate.Create;
FOrderList.Sort(FComparer_OrderDate); // <--- 'stack overflow' error.
//声明
TOrder=记录
ID:整数;
订单日期:TDate;
结束;
POrder=^TOrder;
FOrderList:TList;
TComparer\u OrderDate=类别(TComparer)
公众的
函数比较(常数a,b:POrder):整数;推翻
结束;
函数TComparer\u OrderDate.Compare(常数a,b:POrder):整数;
开始
结果:=0;
如果(a^.OrderDate>b^.OrderDate),则
结果:=1
其他的
结果:=-1;
结束;
//按钮OnClick事件中的以下代码:
FOrderList:=TList.Create;
FComparer\u OrderDate:=TComparer\u OrderDate.Create;
FOrderList.Sort(FComparer_OrderDate);// 比较函数需要返回0表示相等。像这样:
function TComparer_OrderDate.Compare(const a, b: POrder): Integer;
begin
if (a^.OrderDate > b^.OrderDate) then
Result := 1
else if (a^.OrderDate < b^.OrderDate) then
Result := -1
else
Result := 0;
end;
end;
函数TComparer\u OrderDate.Compare(常数a,b:POrder):整数;
开始
如果(a^.OrderDate>b^.OrderDate),则
结果:=1
否则,如果(a^.OrderDate
制作比较器更容易使用
FOrderList.Sort(
TComparer<POrder>.Construct(
function(const a, b: POrder): Integer
begin
if (a^.OrderDate > b^.OrderDate) then
Result := 1
else if (a^.OrderDate < b^.OrderDate) then
Result := -1
else
Result := 0;
end;
end
)
);
FOrderList.Sort(
t比较程序.构造(
函数(常数a,b:POrder):整数
开始
如果(a^.OrderDate>b^.OrderDate),则
结果:=1
否则,如果(a^.OrderDate
或使用默认的日期时间比较器:
DateTimeComparer := TComparer<TDateTime>.Default;
FOrderList.Sort(
TComparer<POrder>.Construct(
function(const a, b: POrder): Integer
begin
Result := DateTimeComparer.Compare(a^.OrderDate, b^.OrderDate);
end
)
);
DateTimeComparer:=TComparer.Default;
福特列表(
t比较程序.构造(
函数(常数a,b:POrder):整数
开始
结果:=DateTimeComparer.Compare(a^.OrderDate,b^.OrderDate);
结束
)
);
我还没有编译这些,所以我希望会有一些小错误。可能会重复Ok。我使用了“Result:=TComparer.Default.Compare(a^.ID,b^.ID);”这似乎是可行的。为什么?为什么你在Q中按日期排序,而在评论中按ID排序?