Ordenar una colección, podría tomarse como una de las tareas más triviales dentro del desarrollo de algo: Sobrescribir el método Sort(), implementar IComparer o IComparable, etc. Pero a veces en aras del tiempo necesitas hacerlo de forma aún más rápida, esencialmente con colecciones "inocuas" (llamo a esto una simple collección que implementa List<object> ej: OrderCollection : List<Order>). En ese momento es que encontré un uso realmente práctico a la combinación de Tipos Genéricos y Métodos Anónimos: utilizarlos para ordenar una colección.
En primer lugar tomemos una clase Order la cual contiene las propiedades: Id, CreatedDate y Value. (los nombres se han tomado simplemente para términos de explicación) definida así:
[Serializable]
public class Order
{
private int _Id;
private decimal _Value;
private DateTime _CreatedDate;
public int Id
{
get { return _Id; }
set { _Id = value; }
}
public decimal Value
{
get { return _Value; }
set { _Value = value; }
}
public DateTime CreatedDate
{
get { return _CreatedDate; }
set { _CreatedDate = value; }
}
}
Y además se define la colección de items de tipo Order:
public class OrderCollection: List<Order> { }
Para uso práctico en un reporte específico necesitas ordenar la lista de órdenes que has obtenido por la propiedad CreatedDate, allí entran los métodos anónimos, inserto el código para luego explicar:
private void BindOrders()
{
//Obtener las órdenes de la DB.
OrderCollection orders = Orders.GetAllOrders();
//Sort - Orden por CreatedDate
orders.Sort(
delegate(Order x, Order y)
{
return Comparer<DateTime>.Default.Compare
(x.CreatedDate, x.CreatedDate);
}
);
//Asignación
Repeater rptOrders = FindControls("rptOrders") as Repeater;
if (rptOrders != null)
{
rptOrders.DataSource = orders;
rptOrders.DataBind();
}
}
Pues qué hemos hecho aqui? Espero ya hayas encontrado el punto clave y no tengas que leer el resto.
-
Utilizamos la sobrecarga del método Sort() para utilizar un delegado, a este delegado se le asignan los parámetros x & y como objetos de Tipo Order.
-
Creamos el método anónimo para ese delegado, allí sin más ni más. Comúnmente deberíamos generar otro método que maneje la delegación... pero podemos hacerlo allí.
-
Retornamos en ese método anónimo la comparación de los objetos generada mediante la implementación de Comparer<DateTime> que crea una instancia "genérica" de Comparer con el tipo DateTime.
-
El compare recibe las propiedades del objeto x & y para realizar la comparación.
-
Listo.
Este mecanismo "elegante" como denominarían algunos podría permitirnos realizar muchas funciones de sort sin requerir ir a modificar las clases bases, especialmente si no tienes acceso al código fuente base. Como el caso de un custom framework. De esta manera podríamos tomar cualquier propiedad para realizar el Sort().
Espero que este ejemplo simple y pequeño pueda ayudarlos y aliviarles una jornada de trabajo, tal como me pasó a mí.
Happy Coding.
Actualmente calificado con 5.0 por 2 personas
- Currently 5/5 Stars.
- 1
- 2
- 3
- 4
- 5