Delphi &引用;“堆栈溢出”;泛型TList.Sort出错

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

我已经实现了Generics.Defaults.TComparer来对类型化的TList进行排序。但是,当调用Sort方法时,它会抛出一个异常“Stack overflow at…”

为什么会发生堆栈溢出错误

// 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排序?