Cómo ordenar una lista <T> por una propiedad en el objeto
Tengo una clase llamada Order
que tiene propiedades como OrderId
, OrderDate
, Quantity
y Total
. Tengo una lista de esta Order
clase:
List<Order> objListOrder = new List<Order>();
GetOrderList(objListOrder); // fill list of orders
Quiero ordenar la lista según una propiedad del Order
objeto; por ejemplo, ya sea por OrderDate
o OrderID
.
¿Cómo puedo hacer esto en C#?
La forma más sencilla que se me ocurre es utilizar Linq:
List<Order> SortedList = objListOrder.OrderBy(o=>o.OrderDate).ToList();
Si necesita ordenar la lista in situ, puede utilizar el Sort
método pasando un Comparison<T>
delegado:
objListOrder.Sort((x, y) => x.OrderDate.CompareTo(y.OrderDate));
Si prefiere crear una secuencia nueva ordenada en lugar de ordenarla in situ, puede utilizar el OrderBy
método de LINQ, como se menciona en las otras respuestas.
Para hacer esto sin LINQ en .Net2.0:
List<Order> objListOrder = GetOrderList();
objListOrder.Sort(
delegate(Order p1, Order p2)
{
return p1.OrderDate.CompareTo(p2.OrderDate);
}
);
Si estás en .Net3.0, entonces la respuesta de LukeH es lo que buscas.
Para ordenar varias propiedades, aún puede hacerlo dentro de un delegado. Por ejemplo:
orderList.Sort(
delegate(Order p1, Order p2)
{
int compareDate = p1.Date.CompareTo(p2.Date);
if (compareDate == 0)
{
return p2.OrderID.CompareTo(p1.OrderID);
}
return compareDate;
}
);
Esto le daría fechas ascendentes con identificadores de orden descendentes .
Sin embargo, no recomendaría mantener delegados, ya que significaría muchos lugares sin reutilización de código. Deberías implementar un IComparer
y simplemente pasarlo a tu Sort
método. Mira aquí .
public class MyOrderingClass : IComparer<Order>
{
public int Compare(Order x, Order y)
{
int compareDate = x.Date.CompareTo(y.Date);
if (compareDate == 0)
{
return x.OrderID.CompareTo(y.OrderID);
}
return compareDate;
}
}
Y luego, para usar esta clase IComparer, simplemente cree una instancia y pásela a su método Sort:
IComparer<Order> comparer = new MyOrderingClass();
orderList.Sort(comparer);
La forma más sencilla de ordenar una lista es usarOrderBy
List<Order> objListOrder =
source.OrderBy(order => order.OrderDate).ToList();
Si desea ordenar por varias columnas, como la siguiente consulta SQL.
ORDER BY OrderDate, OrderId
Para lograr esto, puedes usar ThenBy
lo siguiente.
List<Order> objListOrder =
source.OrderBy(order => order.OrderDate).ThenBy(order => order.OrderId).ToList();