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

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 ...

¿Fue útil?

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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top