Ordenar un IList

14/12/2006 - 09:57 por ANT1 | Informe spam
Hola a todos.

Estoy tratando de implementar las interfaces Icomparar e Icomparable a
mis clases para poder realizar sobre ellas el Sort del DataGridView.

Y es que para mi DataGridView utiliz como fuente un IList, indicando
que la fuente va a ser de un objeto de dicha clase. He estado mirando
pero ando muy perdido.

En principio estoy mirando por el controlador de evento de doble click
sobre la cabecera de una columna, para que en dicho metodo coja, de los
argumentos e que envia el evento, el indice de la columna y con este
obtener el DataPropertyName de esta, que coincide con el nombre de la
propiedad (string, int, o lo que sea) de mi clase, por la que quiero
ordenar el IList.

Pero ¿exactamente que tengo que implementar en los metodos de
IComparer e IComparable?.

No se si con el string DataPropertyName puedo llegar a hacer algo, si
tengo que realizar yo toda la comparacion ordenando manualmente todo,
si al ser strings ints y demas las propiedades de mi clase solo con
inidcarle por cual de ellas ordenar podria ordenarse mas
automaticamente, y, si esto ultimo se puede hacer, como se hace, ...

He visto por ahi en paginas ejemplos de como realizar Srots
programaticamente, pero me temo que no son exactamente lo que busco o
implementan una serie de metodos que, a mi parecer, son innecesarios y
extremadamento complejos.

Si alguien puede orientarme un poco le estara muy agradecido.
 

Leer las respuestas

#1 Hernan
14/12/2006 - 17:20 | Informe spam
Estoy tratando de implementar las interfaces Icomparar e Icomparable a
mis clases para poder realizar sobre ellas el Sort del DataGridView.



¿No has probado con el evento SortCompare?

Pero ¿exactamente que tengo que implementar en los metodos de
IComparer e IComparable?.



En teoría no necesitas implementar las dos interfaces. Con
implementar IComparer es suficiente. De todas formas si quieres
las dos puedes (debes) implementar una usando la otra.

En cuanto a qué implementar, solo tienes que hacer un método.
IComparer.Compare(object x, object y)
que comparará x con y usando la propiedad que quieras.

La clase podría recibir (por ejemplo, en el constructor) el
nombre de la propiedad por la cual comparas que el método
Compare usará para la comparación.

Algo así:

public class ComparaPersonas : IComparer {
private string _nombrePropiedadComparacion;

public ComparaPersonas(string nombrePropiedadComparacion) {
_nombrePropiedadComparacion nombrePropiedadComparacion;
}

public int Compare(object x, object y) {
Persona px = (Persona) x;
Persona py = (Persona) y;

switch (_nombrePropiedadComparacion) {
case "Nombre": return (string.Compare(px.Nombre,
py.Nombre));
case "DNI": return (px.DNI - py.DNI);
default: throw new Exception("error");
}
}
}

Esto es un ejemplo como para darte una idea, nada mas.
No está probado, ni siquiera se si compila.

-H.

Preguntas similares