2012-09-05 19 views
4

我需要實現一個二進制搜索TObjectList使用自定義比較器,我相信使用TCustomComparer。實現自定義二進制搜索TObjectList <myClass>(德爾福XE)

目標:二進制搜索返回符合特定屬性參數的列表中的實例。

例如:

TMyClass=class 
    public 
    Index:integer 
end; 

TMyObjectList=TObjectList<TMyClass>; 

begin 
    ... 
    aMyClass.Index:=1; 
    aMyObjectList.binarysearch(aMyClass, aMyClassRef) 
    ... 
end; 

或者乾脆:

begin 
    ... 
    aMyObjectList.binarysearch(1, aMyClassRef) 
    ... 
end; 

我要循環,並取回TMyClass的情況下,在列表中也有索引== 1。

在C++中,重載'=='操作符可以實現此目標。

新的德爾福'幫助'是相當稀疏和分散在難以找到的東西,我不熟悉新的德爾福泛型的所有細微差別。

所以 - 我如何在Delphi XE中使用Generics.TObjectList?

(使用Delphi XE)。

TIA

回答

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函數。它只需要具有與上面相同的簽名。

由於總是與比較函數,返回< 0如果Left<Right,> 0如果Left>Right和0,如果Left=Right

+0

感謝大衛 - 你的編輯彈出,就像我問自己你回答的問題一樣。 – Vector

+1

很高興看到你仍然在這裏工作辛苦大衛。我個人有一份工作,除非有必要,否則不會在這裏花費太多時間。希望我能貢獻更多。我確實閱讀了大量的源代碼,但我已經遲到了這個項目,我知道我會馬上在這裏得到答案。再次感謝。中號 – Vector