我是一个 Delphi 新手,我不明白如何调用 TList of Records 的 Sort 方法以便按升序整数值对记录进行排序。 我有如下记录:
type
TMyRecord = record
str1: string;
str2: string;
intVal: integer;
end;
以及此类记录的通用列表:
TListMyRecord = TList<TMyRecord>;
尝试在帮助文件中查找代码示例,并找到了这个:
MyList.Sort(@CompareNames);
我不能使用它,因为它使用类。所以我尝试编写自己的比较函数,参数略有不同:
function CompareIntVal(i1, i2: TMyRecord): Integer;
begin
Result := i1.intVal - i2.intVal;
end;
但是当我使用 open.Sort(CompareIntVal); 调用它时,编译器总是抛出“参数不足”错误,这似乎很明显;所以我试着更接近帮助文件:
function SortKB(Item1, Item2: Pointer): Integer;
begin
Result:=PMyRecord(Item1)^.intVal - PMyRecord(Item2)^.intVal;
end;
PMyRecord 为 PMyRecord = ^TMyRecord;
我尝试了不同的方法来调用函数,总是遇到一些错误......
最佳答案
Sort
您应该使用的重载是这个:
procedure Sort(const AComparer: IComparer<TMyRecord>);
现在,您可以创建 IComparer<TMyRecord>
通过调用 TComparer<TMyRecord>.Construct
。像这样:
var
Comparison: TComparison<TMyRecord>;
....
Comparison :=
function(const Left, Right: TMyRecord): Integer
begin
Result := Left.intVal-Right.intVal;
end;
List.Sort(TComparer<TMyRecord>.Construct(Comparison));
我已经写了Comparison
函数作为匿名方法,但您也可以使用普通的旧式非 OOP 函数或对象的方法。
比较函数的一个潜在问题是您可能会遇到整数溢出问题。因此您可以使用默认的整数比较器。
Comparison :=
function(const Left, Right: TMyRecord): Integer
begin
Result := TComparer<Integer>.Default.Compare(Left.intVal, Right.intVal);
end;
调用TComparer<Integer>.Default
可能会很贵重复,以便您可以将其存储在全局变量中:
var
IntegerComparer: IComparer<Integer>;
....
initialization
IntegerComparer := TComparer<Integer>.Default;
要考虑的另一个选项是在创建列表时传入比较器。如果您只使用此顺序对列表进行排序,那么会更方便。
List := TList<TMyRecord>.Create(TComparer<TMyRecord>.Construct(Comparison));
然后您可以使用以下命令对列表进行排序
List.Sort;
关于delphi - 如何使用自定义比较器对通用列表进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13252169/