gpt4 book ai didi

delphi - 实现 TObjectList 的自定义二进制搜索 (Delphi XE)

转载 作者:行者123 更新时间:2023-12-03 15:29:10 32 4
gpt4 key购买 nike

我需要在使用自定义比较器的 TObjectList 上实现二分搜索,我相信使用 TCustomComparer。

目标:二分查找返回列表中符合特定属性参数的实例。

例如:

TMyClass=class
public
Index:integer
end;

TMyObjectList=TObjectList<TMyClass>;

begin
...
aMyClass.Index:=1;
aMyObjectList.binarysearch(aMyClass, aMyClassRef)
...
end;

或者简单地说:

 begin
...
aMyObjectList.binarysearch(1, aMyClassRef)
...
end;

我想循环并获取列表中 Index==1 的 TMyClass 实例。

在 C++ 中,重载“==”运算符可以实现此目标。

新的 Delphi“帮助”相当稀疏和分散,使得东西很难找到,而且我不太熟悉新的 Delphi 泛型的所有细微差别。

那么 - 我如何在 Delphi XE 中使用 Generics.TObjectList 做到这一点?

(使用 Delphi XE)。

TIA

最佳答案

这里的帮助文件确实有点有限。我一般只是读源码到Generics.DefaultsGenerics.Collections 。无论如何,您需要提供一个 IComparer<TMyClass> 。有很多方法可以做到这一点。例如,使用匿名函数:

var
List: TObjectList<TMyClass>;
Target: TMyClass;
Index: Integer;
Comparer: IComparer<TMyClass>;
Comparison: TComparison<TMyClass>;
....
Comparison :=
function(const Left, Right: TMyClass): Integer
begin
//Result := ??;//your comparison rule goes here
end;
Comparer := TComparer<TMyClass>.Construct(Comparison);
List.BinarySearch(Target, Index, Comparer);

如果你不想使用匿名函数,你可以实现 Comparison其他方式。例如某个对象的方法,或者类函数,甚至只是一个普通的老式非 OOP 函数。它只需具有与上面相同的签名即可。

与往常的比较函数一样,如果 Left<Right 返回 <0 , >0 如果 Left>Right如果 Left=Right 则为 0 .

关于delphi - 实现 TObjectList<myClass> 的自定义二进制搜索 (Delphi XE),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12287279/

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