2010-08-13 5 views
2

J'ai un certain nombre dactylographiées tlists que je rencontrais des problèmes pour faire pour trierComment trier une dactylographié Tlist

Normalement, pour un typées TList, j'aurais une fonction telle que:

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; 

ce qui serait appelé par la liste

JobList.Sort(SortByJob) 

Cependant, j'ai décidé dans ma demande actuelle que nous voulons bloquer les tlists à certains types de pointeur, donc dans l'exemple ci-dessus, nous aurions la JOBLIST a déclaré que:

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

Maintenant, quand je l'appelle

JobList[0].Sort(SortByJob) 

Je reçois une erreur "pas assez de paramètres".

Des idées?

J'ai comparé que si j'utilise la fonction de tri ci-dessus sur un « standard » typées TList il compilera correctement ...

+1

Il convient de noter que TList et TList sont 2 objets totalement indépendants. Ils partagent une même "API" similaire, mais c'est tout. –

+0

@ Krom-Stern, cela a été demandé 2 ans avant celui que vous avez marqué une copie de! –

+0

@DanKelly: Vous avez raison, mais je pensais qu'il est préférable de relier la question moins populaire à un plus populaire .. – Kromster

Répondre

10

Une liste générique est une instance triées à l'aide de IComparer. Voici un exemple qui trie une liste d'entiers:

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

Peut-elle être appelée sans imbriquer la fonction? ? –

+0

Bien sûr, faites juste L.Sort (TComparer .Construct (MySortFunc)); au lieu. –

+0

Merci - c'était le const dans les paramètres que je jouais et sont nécessaires dans le ci-dessus! –