gpt4 book ai didi

Delphi - 通用 TList 排序

转载 作者:行者123 更新时间:2023-12-05 08:46:54 26 4
gpt4 key购买 nike

我正在使用 Generics.Collections.TList 和 Sort 方法。它工作正常,但我想最后对空值或空值进行排序。按升序和降序排序。如何实现?

这是我的排序函数:

function TForm.SortByColumn(ColumnID: integer; SortDirRev: integer):boolean;
var
Comparison: TComparison<TSymData>;
begin
Result := false;

Comparison := nil;

if ColumnID = 0 then
begin
Comparison := function(const Left, Right: TSymData): integer
begin
Result := SortDirRev * TComparer<string>.Default.Compare(Left.Name,Right.Name);
end;
end
else
begin
Comparison := function(const Left, Right: TSymData): integer
begin
Result := SortDirRev * TComparer<string>.Default.Compare(Left.Sub[ColumnID-1],Right.Sub[ColumnID-1]);
end;
end;

if assigned(Comparison) then
FSymList.Sort(TComparer<TSymData>.Construct(Comparison));

end;

最佳答案

您只需要提供一个将空值考虑在内的比较函数。

比较函数是一个接受两项 A 和 B 的函数,如果 A 应该在 B 之前返回 -1,如果 A 应该在 B 之后返回 +1,如果 A 和 B 被认为相等则返回 0。

例如,要使用标准字符串比较器对 L 字符串列表进行排序,您可以这样做(仅供引用)

L.Sort(
TComparer<string>.Construct(
function(const Left, Right: string): Integer
begin
Result := CompareStr(Left, Right)
end
)
);

根据字符串长度排序

L.Sort(
TComparer<string>.Construct(
function(const Left, Right: string): Integer
begin
Result := CompareValue(Left.Length, Right.Length)
end
)
);

现在,如果你想正常排序字符串,除了你明确要求所有空字符串排在第一位,你可以这样做

L.Sort(
TComparer<string>.Construct(
function(const Left, Right: string): Integer
begin
if Left.IsEmpty and not Right.IsEmpty then
Result := -1
else if not Left.IsEmpty and Right.IsEmpty then
Result := +1
else
Result := CompareStr(Left, Right)
end
)
);

要让空字符串最后,做

L.Sort(
TComparer<string>.Construct(
function(const Left, Right: string): Integer
begin
if Left.IsEmpty and not Right.IsEmpty then
Result := +1
else if not Left.IsEmpty and Right.IsEmpty then
Result := -1
else
Result := CompareStr(Left, Right)
end
)
);

关于Delphi - 通用 TList 排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68722965/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com