Cómo ordenar una lista con tipo [duplicado]
Pregunta
Esta pregunta ya tiene una respuesta aquí:
Tengo un número de Typed TLists que estoy teniendo problemas para conseguir a sort
Normalmente, para un TList sin tipo, que tendría una función como:
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;
¿Qué sería llamado por la lista ??p>
JobList.Sort(SortByJob)
Sin embargo he decidido en mi aplicación actual que queremos bloquear las TLists a ciertos tipos de puntero, por lo que en el ejemplo anterior tendríamos la lista de tareas declararse como:
JobList: array[0..4] of TList<JobsPointer>;
Ahora cuando llamo
JobList[0].Sort(SortByJob)
Me sale un error de "no hay suficientes parámetros".
¿Alguna idea?
He comparado que si utilizo la función de clasificación más en un sin tipo "estándar" TList entonces se compilará correctamente ...
Solución
Una lista genérica se clasifica utilizando una instancia de IComparer. Aquí hay un ejemplo que ordena una lista de números enteros:
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;