4

我需要在使用自定义比较器的 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 泛型的所有细微差别都不是很熟悉。

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

(使用德尔福 XE)。

TIA

4

1 回答 1

5

帮助文件在这里确实有点有限。我通常只是阅读源代码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 函数。它只需要具有与上述相同的签名。

与比较函数一样,返回 <0 if Left<Right、 >0 ifLeft>Right和 0 if Left=Right

于 2012-09-05T18:23:39.670 回答