Cómo ordenar una lista <T> por una propiedad en el objeto

Resuelto Shyju asked hace 14 años • 24 respuestas

Tengo una clase llamada Orderque tiene propiedades como OrderId, OrderDate, Quantityy Total. Tengo una lista de esta Orderclase:

List<Order> objListOrder = new List<Order>();
GetOrderList(objListOrder); // fill list of orders

Quiero ordenar la lista según una propiedad del Orderobjeto; por ejemplo, ya sea por OrderDateo OrderID.

¿Cómo puedo hacer esto en C#?

Shyju avatar Jul 22 '10 20:07 Shyju
Aceptado

La forma más sencilla que se me ocurre es utilizar Linq:

List<Order> SortedList = objListOrder.OrderBy(o=>o.OrderDate).ToList();
Lazarus avatar Jul 22 '2010 13:07 Lazarus

Si necesita ordenar la lista in situ, puede utilizar el Sortmé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 OrderBymétodo de LINQ, como se menciona en las otras respuestas.

LukeH avatar Jul 22 '2010 13:07 LukeH

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 IComparery simplemente pasarlo a tu Sortmé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);
djdd87 avatar Jul 22 '2010 13:07 djdd87

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 ThenBylo siguiente.

  List<Order> objListOrder = 
    source.OrderBy(order => order.OrderDate).ThenBy(order => order.OrderId).ToList();
PSK avatar Jul 22 '2010 13:07 PSK