Luego de un largo receso, he vuelto, había dejado a un lado el blog, pero voy a retomarlo, tratando de compartir un poco más de información acerca del .Net Framework. En anteriores post los ejemplos los hice en vb, pero, para complacer a algunos que me lo han solicitado voy a montar los ejemplos en C# por un rato.
Bueno, empecemos, ya había tocado el tema de interfaces pero de forma muy general, esta vez vamos a ver con mayor detalle la interface IComparable.
Esta interface permite implementar clases que puedan ser ordenadas, hay que tener cuidado con el nombre que tiende a confundir ya que usualmente se tiende a pensar que esta interface permite implementar métodos para comparar dos instancias, pero en realidad la encargada de permitir la comparación entre dos objetos es la interface IEquatable, pero de esta hablaremos en futuros posts.
Para hacer uso de esta interface es necesario implementar el método CompareTo, este método recibe un argumento de tipo object, por lo que usualmente es necesario verificar el tipo de instancia para asegurarnos que es compatible con nuestra clase para ser comparado, luego debemos definir el criterio de comparación a utilizar, en el ejemplo siguiente se tiene la clase persona, y el criterio que se seleccionó para comparar es la edad, esto solo para fines de este ejemplo, bien pudo ser el nombre o el apellido o cualquier otro dato basado en el cual vamos a realizar el ordenamiento, veamos el siguiente ejemplo para aclarar lo dicho:
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text;
namespace Prac_IComparable { class Program { static void Main(string[] args) { Persona Juan = new Persona("Juan", 15); Persona Luis = new Persona("Luis", 12); Persona Maria = new Persona("Maria", 18); ArrayList ListaPersonas = new ArrayList();
ListaPersonas.Add(Juan); ListaPersonas.Add(Luis); ListaPersonas.Add(Maria);
foreach (Persona persona in ListaPersonas ) { Console.WriteLine(persona.ToString()); } Console.WriteLine("Ordenando...."); ListaPersonas.Sort(); foreach (Persona persona in ListaPersonas) { Console.WriteLine(persona.ToString()); }
Console.ReadLine(); } }
class Persona :IComparable { #region IComparable Members public int CompareTo(object obj) { if (obj is Persona) { Persona persona = (Persona)obj; return Edad.CompareTo(persona.Edad); } throw new ArgumentException("No es posible comparar una Persona con un objeto diferente"); } #endregion private string nombre; private Int16 edad; public string Nombre { get { return nombre; } set { nombre = value; } }
public Int16 Edad { get { return edad; } set { edad = value; } } public Persona(string _nombre, Int16 _edad) { Nombre = _nombre; Edad = _edad; } public override string ToString() { return "Nombre: "+Nombre + "Edad: "+ Edad ; } } } |
Más información acerca de la interface IComparable en: http://msdn.microsoft.com/es-es/library/system.icomparable(VS.80).aspx