实现TObjectList的自定义二进制搜索<myclass>(Delphi XE)</myclass>

时间:2012-09-05 18:04:51

标签: delphi delphi-xe binary-search generic-collections

我需要在使用自定义比较器的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

1 个答案:

答案 0 :(得分:4)

这里的帮助文件确实有点受限。我通常只是阅读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则返回&lt; 0,如果Left>Right则返回0,如果Left=Right则返回0。