You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi 11 FMX中TList<>.Sort()方法无法正常使用求助

Delphi 11 FMX 泛型列表排序编译错误解决

错误原因

你在调用Sort方法时错误地给变量aSpcList添加了<TSpecies>类型参数——aSpcList本身已经是TList<TSpecies>类型的实例,不需要额外指定类型。编译器会把<>解析为比较运算符,导致语法错误。

修正方案

方案1:修正函数指针调用方式

直接调用Sort方法并传入比较函数的地址即可,不需要额外的类型参数:

procedure GenReorderSpeciesList(var aSpcList : TList<TSpecies>);
begin
  aSpcList.Sort(@CompareMyObjects);
end;

同时可以优化比较函数,用AnsiCompareText返回值取反实现降序,代码更简洁:

function CompareMyObjects(Item1, Item2: TSpecies): Integer;
begin
  // 按SPGroup升序(不区分大小写)
  Result := AnsiCompareText(Item1.SPGroup, Item2.SPGroup);
  if Result <> 0 then Exit;

  // SPGroup相同则按Family升序(不区分大小写)
  Result := AnsiCompareText(Item1.Family, Item2.Family);
  if Result <> 0 then Exit;

  // 前两个字段相同则按Subfamily降序(不区分大小写)
  Result := -AnsiCompareText(Item1.Subfamily, Item2.Subfamily);
end;

方案2:使用匿名函数(更现代的写法)

无需单独定义比较函数,直接在Sort方法中传入匿名委托,代码更紧凑:

procedure GenReorderSpeciesList(var aSpcList : TList<TSpecies>);
begin
  aSpcList.Sort(
    function(Item1, Item2: TSpecies): Integer
    begin
      Result := AnsiCompareText(Item1.SPGroup, Item2.SPGroup);
      if Result <> 0 then Exit;
      Result := AnsiCompareText(Item1.Family, Item2.Family);
      if Result <> 0 then Exit;
      Result := -AnsiCompareText(Item1.Subfamily, Item2.Subfamily);
    end
  );
end;

验证说明

两种方案都能解决编译错误,且实现你需要的排序逻辑:

  • 优先按SPGroup不区分大小写升序
  • 再按Family不区分大小写升序
  • 最后按Subfamily不区分大小写降序

内容的提问来源于stack exchange,提问作者Bennie Coetzer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 02:52:41