2011-01-24 15 views
8

Quiero ordenar mi lista de elementos genéricos utilizando el método de clasificación incorporado.Problema Delphi: Ordenando una Tobjectlist <>

aquí es lo que hago:

//create the list object 
myList := TObjectList<MyType>.Create(false); 

[...] //populate the list with unsorted entries 

//sort the list 
myList.sort(@Comparer); 

[...]//store sorted results back to array 

myList.Destroy; 

mi función Comparer se ve así:

function Comparer(Item1, Item2 : pointer):integer; 
begin 
    result := myCompare(item1, item2); 
end; 

De acuerdo con las especificaciones, debería funcionar de esta manera.

Obtengo un E2250 error del compilador Sin versión sobrecargada de 'sort' existir con estos parámetros (texto exacto difiere, utilizar una versión Inglés non de RAD Studio)

no tengo ni idea de por qué esto no debería sea ​​válido Pascal - ¿alguno de ustedes tiene ideas para compartir sobre esto?

+0

Aunque Leonardo y yo ofrecimos más detalles, la respuesta de Rob es la más útil para usted. El compilador generalmente da razones claras por las que se opone a algo. –

Respuesta

8

Usted está casi allí. Como no sé qué MyType es posible que necesite cambiar la llamada a su función myCompare.

myList.Sort(TComparer<MyType>.Construct(
    function (const L, R: MyType): integer 
    begin 
    result := myCompare(L, R); 
    end 
)); 
+0

+1 Leonardo. es bueno ver otro programador delphi chileno por aqui, pense que estaba solo;). – RRUZ

+0

Heh. Habíamos tenido los tiempos de Delphi 1 ... –

+0

Bueno me refiero a la realidad a StackOverflow, pero sobre delphi tienes razon, al parecer somos una raza en extinción. – RRUZ

6

TObjectList<T>.Sort se declara como:

procedure Sort(const AComparer: IComparer<T>); 

IComparer<T> se define como:

IComparer<T> = interface 
    function Compare(const Left, Right: T): Integer; 
end; 

Estás crear instancias de TObjectList<MyType> y lo que necesita para pasar una IComparer<MyType> a Sort. Para hacer esto necesitarás un objeto para proporcionar una implementación concreta de esa interfaz.

Una forma obvia de hacerlo sería crear la subclase TObjectList<MyType> e implementar allí la interfaz.

Otra forma de hacer esto es usar TComparer<T> para crear un bajo demanda usando su función de clase Construct. Debería proporcionar una función de comparación:

TComparison<T> = reference to function(const Left, Right: T): Integer; 

La respuesta de Leonardo demuestra cómo hacerlo.

4

Si el compilador dice que no existe una versión sobrecargada con ese tipo de parámetro, pregúntese qué hay sobrecarga do existe. Compruebe el código fuente o the documentation para averiguarlo.

Ahí verá que TObjectList<T> hereda dos métodos Sort de TList<T>. Uno no toma argumentos, y el otro toma una referencia a algo que implementa la interfaz IComparer<T>. Su función independiente no se ajusta a eso. Escriba un descendiente de TComparer<MyType> y anule su método Compare.

Cuestiones relacionadas