2010-08-13 16 views
2

我有一些這我有越來越排序如何排序類型化TLIST

通常問題類型化TLists的,非類型化從TList,我想有一個功能,如:

function SortByJob(Item1: Pointer; Item2: Pointer): Integer; 
var 
    p1, p2: JobPointer; 
begin 
    p1 := JobPointer(Item1); 
    p2 := JobPointer(Item2); 
    if p1.job > p2.job then 
     Result := 1 
    else 
     if p1.job = p2.job then 
     Result := 0 
     else 
     Result := -1 
end; 

這將通過列表

JobList.Sort(SortByJob) 

但是我在當前的應用程序已經決定,我們要鎖定的TLists某些指針類型被調用,所以在上面的例子中,我們將有招賢納才聲明:

JobList: array[0..4] of TList<JobsPointer>; 

現在,當我打電話

JobList[0].Sort(SortByJob) 

我得到一個 「沒有足夠的參數」 的錯誤。

任何想法?

我比較,如果我使用上面的排序功能對非類型化的「標準」從TList那麼它會被正確編譯...

+1

這是值得注意的是,從TList和從TList 2個風馬牛不相及的對象。他們確實分享了類似的「API」,但就是這樣。 – 2010-08-13 16:59:26

+0

@克羅姆斯特恩,這是在你把它標記爲重複之前的2年之前問的! – 2015-05-05 12:02:30

+0

@DanKelly:你說的對,但我認爲最好是將較少受歡迎的問題與更受歡迎的問題聯繫起來。 – Kromster 2015-05-05 15:48:12

回答

10

泛型列表使用的IComparer的實例進行排序。下面是排序整數列表的例子:

uses Generics.Collections, Generics.Defaults; 

procedure TForm1.FormCreate(Sender: TObject); 
var 
    L : TList<integer>; 
begin 
    L := TList<integer>.Create; 
    L.Add(2); 
    L.Add(1); 

    L.Sort(TComparer<integer>.Construct(
    function (const L, R: integer): integer 
    begin 
     Result := L - R; 
    end 
)) ; 

    L.Free; 
end; 
+0

這可以不嵌套函數調用? – 2010-08-13 14:37:07

+0

當然只是做L.Sort(TComparer .Construct(MySortFunc));代替。 – 2010-08-13 15:24:20

+0

謝謝 - 這是參數中的const,我在搞亂並且在上面需要! – 2010-08-16 09:26:46