我需要在使用自定义比较器的TObjectList上实现二进制搜索,我相信使用TCustomComparer. 目标:二进制搜索返回列表中符合特定属性参数的实例. 例如: TMyClass=class public Index:integerend;TMyObjectL
目标:二进制搜索返回列表中符合特定属性参数的实例.
例如:
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泛型的所有细微差别.
那么 – 我如何使用Generics.TObjectList在Delphi XE中执行此操作?
(使用Delphi XE).
TIA
这里的帮助文件确实有点受限.我通常只是阅读Generics.Defaults和Generics.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);
如果您不想使用匿名函数,可以通过其他方式实现比较.例如,某个对象或类函数的方法,或者甚至只是普通的老式非OOP函数.它必须具有与上面相同的签名.
与比较函数一样,如果Left< Right,则返回< 0;如果Left>则返回0;如果Left = Right,则返回0.
