2011-01-24 2 views
8

組み込みのソート方法を使用して汎用のオブジェクトリストをソートしたいと思います。Delphiの問題:Tobjectlistをソートする<>

//create the list object 
myList := TObjectList<MyType>.Create(false); 

[...] //populate the list with unsorted entries 

//sort the list 
myList.sort(@Comparer); 

[...]//store sorted results back to array 

myList.Destroy; 

私はComparer機能は、次のようになります:

function Comparer(Item1, Item2 : pointer):integer; 
begin 
    result := myCompare(item1, item2); 
end; 

はスペックによると、それは次のように動作するはずここ

は、私が何をすべきかです。

は私は見当がつかない

(私はRAD Studioのの非英語バージョンを使用し、正確な内容は異なり)は、これらのパラメータに存在するコンパイラのエラーE2250 「ソート」のないオーバーロードされたバージョンを取得する理由は、これはいけません有効なパスカルである - あなたの誰もがこれを共有するための洞察力を持っていますか?

+0

レオナルドと私は詳細を述べましたが、ロブの答えはあなたにとって最も有用です。コンパイラは、一般に、それが何かになぜ反対するのか明確な理由を一般的に与えます –

答えて

8

あなたはほぼそこにいます。 MyTypeがわからないので、myCompare関数への呼び出しを変更する必要があるかもしれません。

myList.Sort(TComparer<MyType>.Construct(
    function (const L, R: MyType): integer 
    begin 
    result := myCompare(L, R); 
    end 
)); 
+0

+1 Leonardo。それは、プログラマーがデルファイ・チルノ・ポール・アキー、ペンス・キュー・ソロ・ソロの場合)。 – RRUZ

+0

Heh。 Habíamoshartos en los tiemposのDelphi 1 ... –

+0

は、StackOverflow、Pero、Delphi、Tiny、Razon、Al Parecerのいずれかを参照しています。 – RRUZ

6

TObjectList<T>.Sortは次のように宣言されて:あなたはTObjectList<MyType>をインスタンス化しているので、あなたがSortIComparer<MyType>を渡す必要が

IComparer<T> = interface 
    function Compare(const Left, Right: T): Integer; 
end; 

procedure Sort(const AComparer: IComparer<T>); 

IComparer<T>として定義されます。これを行うには、そのインタフェースの具体的な実装を提供するオブジェクトが必要です。

これを実行する明白な方法の1つは、TObjectList<MyType>をサブクラス化し、そこでインターフェイスを実装することです。

TComparer<T>を使用して、Constructクラス機能を使用してオンデマンドでIComparer<T>を作成することもできます。あなたは比較関数を提供する必要があります:

TComparison<T> = reference to function(const Left, Right: T): Integer; 

レオナルドの答えはこれを実証します。

4

このパラメータタイプのオーバーロードされたバージョンが存在しないとコンパイラに通知された場合は、に何のオーバーロードがあるかをご確認ください。が存在します。調べるには、ソースコードまたはthe documentationを確認してください。

ここで、TObjectList<T>TList<T>の2つのSortメソッドを継承しています。 1つは引数を取らず、もう1つはIComparer<T>インターフェイスを実装するものへの参照を取ります。あなたのスタンドアロンの機能はそれに適合しません。 TComparer<MyType>の子孫を書き、そのCompareメソッドをオーバーライドします。

関連する問題