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 で行うにはどうすればよいでしょうか。

(Delphi XE を使用)。

ティア

4

1 に答える 1

5

ヘルプファイルは確かにここで少し制限されています。私は通常、ソースコードを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);

匿名関数を使用したくない場合は、Comparison他の方法で実装できます。たとえば、あるオブジェクトのメソッド、クラス関数、または単なる昔ながらの非OOP関数です。上記と同じ署名が必要です。

比較関数の場合と同様に、の場合は<0、の場合はLeft<Right> 0、の場合は0を返します。Left>RightLeft=Right

于 2012-09-05T18:23:39.670 に答える