Cómo ordenar una lista…será por opciones!!
El método más habitual para comparar una lista es utilizar el método Sort. Este método utiliza internamente el método CompareTo de los elementos que la lista contiene.
Con datos simples, como un string o un int, no es necesario hacer nada especial para ordenar la lista pero si tenemos una lista de datos más completos, por ejemplo, una lista de entidades, deberemos hacer algo más.
Supongamos que tenemos una entidad que tiene dos propiedades; nombre y fecha, y queremos tener la posibilidad de ordenar por la fecha, tanto de forma ascendente como descendente.
1: public class MiEntidad
2: {
3: public string Nombre { get; set; }
4: public DateTime Fecha { get; set; }
5: }
Opción 1: La primera opción es que nuestra entidad implemente la interfaz IComparable. Ésto nos obligará a implementar un método adicional en nuestra clase, llamado CompareTo. Éste método será al que se llame cuando se llame al método Sort de la lista.
1: public class MiEntidad : IComparable<MiEntidad>
2: {
3: public string Nombre { get; set; }
4: public DateTime Fecha { get; set; }
5:
6: public int CompareTo(MiEntidad other)
7: {
8: return this.Fecha.CompareTo(other.Fecha);
9: }
10: }
Pero ¿ qué pasa si queremos ordenar una lista de objetos y no tenemos acceso al código de la misma y no podemos implementar este método adicional?
Opción 2: Tendremos que crear una nueva clase que implemente IComparer. Esta clase incluya la lógica necesaria para saber cómo tiene que comparar dos objetos de tipo MiEntidad y la emplearemos al llamar al método Sort.
1: public class MiEntidadComparador : IComparer<MiEntidad>
2: {
3: private SortOrderEnum sortOrder = SortOrderEnum.Ascending;
4:
5: public MiEntidadComparador(SortOrderEnum sort)
6: {
7: this.sortOrder = sort;
8: }
9:
10: public int Compare(MiEntidad x, MiEntidad y)
11: {
12: if (this.sortOrder.Equals(SortOrderEnum.Ascending))
13: return x.Fecha.CompareTo(y.Fecha);
14: else
15: return y.Fecha.CompareTo(x.Fecha);
16: }
17: }
Una vez que tenemos la clase, la usaremos al invocar al método Sort.
1: lista.Sort(new MiEntidadComparador(SortOrderEnum.Descending));
2: foreach (MiEntidad me in lista)
3: Console.WriteLine(me.Nombre);
Opción 3: Si aún así no nos apetece hacer esta clase, siempre podemos usar un delegado.
1: lista.Sort(
2: delegate(MiEntidad x, MiEntidad y)
3: {
4: return x.Fecha.CompareTo(y.Fecha);
5: });
Opción 4: Pero todavía hay más opciones, esta vez usando LINQ. Eso sí, recuerda que debes LINQ está disponible a partir de la versión 3.5 de Framework.
1: var listaNombre = from c in lista
2: orderby c.FECHA descending
3: select c.Nombre;
4: foreach (string nombre in listaNombre)
5: Console.WriteLine(nombre);
Opción 4: o lo mismo usando expresiones lambda.
1: foreach (MiEntidad me in lista.OrderByDescending(x=>x.Fecha).ToList())
2: Console.WriteLine(me.Nombre);
Espero que os sea de utilidad!