¿Cómo puedo ordenar la lista genérica DESC y ASC?

110

¿Cómo puedo ordenar la lista genérica DESC y ASC? ¿Con LINQ y sin LINQ? Estoy usando VS2008.

class Program
{
    static void Main(string[] args)
    {
        List<int> li = new List<int>();

        li.Add(456);
        li.Add(123);
        li.Add(12345667);
        li.Add(0);
        li.Add(1);

        li.Sort();

        foreach (int item in li)
        {
            Console.WriteLine(item.ToString() + "\n");
        }

        Console.ReadKey();
    }
}
Penguen
fuente

Respuestas:

246

Con Linq

var ascendingOrder = li.OrderBy(i => i);
var descendingOrder = li.OrderByDescending(i => i);

Sin Linq

li.Sort((a, b) => a.CompareTo(b)); // ascending sort
li.Sort((a, b) => b.CompareTo(a)); // descending sort

Tenga en cuenta que sin Linq, la lista en sí se ordena. Con Linq, obtiene un enumerable ordenado de la lista, pero la lista en sí no ha cambiado. Si desea mutar la lista, cambiaría los métodos Linq a algo como

li = li.OrderBy(i => i).ToList();
Anthony Pegram
fuente
1
@onedaywhen Si cree que la respuesta de otro usuario es incorrecta, debe comentar, votar y / o proporcionar una respuesta que considere correcta, no editar la respuesta de otra persona para que sea lo que usted cree que es correcto.
Servicio
24
Creo que para el orden descendente es mucho más claro de usar li.Sort((a, b) => b.CompareTo(a));que el -1*enfoque usado aquí. Edité la respuesta en consecuencia, pero @Servy la revirtió.
cuando
9
@onedaywhen Cuando el autor cometió un error al escribir lo que pretendía, cambiarlo para que fuera lo que pretendía escribir está bien. Cambiar el código de lo que otra persona pensó que debería ser la solución para usar un enfoque diferente que usted cree que debería usarse en su lugar no es una edición apropiada.
Servicio
5
@onedaywhen Claro; lo verá en cualquier lugar donde vea la descripción de la edición. Desde el centro de ayuda, "¿Cuándo debo editar las publicaciones? [...] Para aclarar el significado de la publicación (sin cambiar ese significado)"
Servy
4
O simplemente -a.CompareTo(b).
Shimmy Weitzhandler
72

Sin Linq:

Ascendente:

li.Sort();

Descendente:

li.Sort();
li.Reverse();
Sani Singh Huttunen
fuente
Sort()es un método nulo, por lo que no puede encadenarlo Reverse()de esta manera. Necesitará 2 operaciones independientes. Sin embargo, con LINQ podría encadenarlo a un, OrderBypero en ese momento debería usarlo OrderByDescendingen su lugar.
Ahmad Mageed
20

sin linq, utilícelo Sort()y luego Reverse().

Srinivas Reddy Thatiparthy
fuente
3

Estaba revisando todas las respuestas anteriores y quería agregar una información adicional más. Quería ordenar la lista en orden DESC y estaba buscando la solución que sea más rápida para entradas más grandes y estaba usando este método antes: -

li.Sort();
li.Reverse();

pero mis casos de prueba fallaban por exceder los límites de tiempo, por lo que la siguiente solución funcionó para mí: -

li.Sort((a, b) => b.CompareTo(a));

Entonces, en última instancia, la conclusión es que la segunda forma de ordenar la lista en orden descendente es un poco más rápida que la anterior.

sarawgeek
fuente
-3

Una forma muy sencilla de ordenar la lista con valores int en orden descendente:

li.Sort((a,b)=> b-a);

¡Espero que esto ayude!

Sunil Murali
fuente
4
Esto no es lo que int.CompareTo(int)hace que la puerta sea una razón. Consulte la fuente en referenceource.microsoft.com que dice: " Necesito usar comparar porque la resta se ajustará a positivo para números neg muy grandes, etc. ". Si tiene b = int.MinValuey a = 1(dice), esto fallará. A veces vale la pena llamar a un método.
Wai Ha Lee
La pregunta dice sobre la clasificación de listas genéricas. La operación "-" ni siquiera se compilaría para muchos tipos. Y para el conjunto compilado de tipos, puede tener un error de desbordamiento numérico como se mencionó en el comentario anterior
Vadim Levkovsky