2010-06-17 15 views
66

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

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(); 
    } 
} 

Respuesta

158

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) => -1* a.CompareTo(b)); // descending sort 

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

li = li.OrderBy(i => i).ToList(); 
+1

@onedaywhen Si considera que la respuesta de otro usuario es incorrecta, debe comentar, votar y/o proporcionar una respuesta que considere correcta, sin editar la respuesta de otra persona para que sea lo que cree que es correcto. – Servy

+12

Creo que para el orden descendente es mucho más claro usar 'li.Sort ((a, b) => b.CompareTo (a));' que el enfoque '-1 *' utilizado aquí. Edité la respuesta en consecuencia, pero @Servy la revirtió. – onedaywhen

+0

@Servy: Creo que la respuesta es materialmente correcta, pero en un caso se ha utilizado una lógica un tanto extraña. El [faq for editing] (http://stackoverflow.com/help/privileges/edit) dice: "Algunas razones comunes para editar [incluir] ... para corregir errores menores". Por lo tanto, parece que "se recomienda que se modifique la respuesta de otra persona para que sea lo que usted cree que es correcto" (no proscrito, como sugiere). – onedaywhen

13

con LINQ a cabo, uso Sort() y luego se Reverse().

48

Sin LINQ:

ascendente:

li.Sort(); 

Descendente:

li.Sort(); 
li.Reverse(); 
+0

'Sort()' es un método nulo, por lo que no puede encadenar 'Reverse()' a él de esta manera. Necesitarás 2 operaciones separadas. Sin embargo, con LINQ puede encadenarlo a un 'OrderBy', pero en ese momento debería usar' OrderByDescending' en su lugar. –

+0

@Ahmad Mageed. Por supuesto ... Derretimiento del final de la tarde ... :( –

+0

Esto es simple y funciona para mí, y mi código de Ordenar existente. –

-1

manera muy simple para ordenar la lista con valores int en orden descendente:

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

Esperanza que este ayuda!

+3

Esto no es lo que 'int.CompareTo (int)' hace que la puerta sea un motivo. Véase [la fuente en referencesource.microsoft.com] (http://referencesource.microsoft.com/#mscorlib/system/int32.cs,225942ed7b7a3252) que dice: "* Necesito usar compare porque la resta se ajustará a positivo para números neg muy grandes, etc. * ". Si tiene' b = int.MinValue' y 'a = 1' (por ejemplo), esto no funcionará.A veces, una llamada a un método lo vale. –

+0

* por una razón ... –

+0

La pregunta dice acerca de la clasificación de listas genéricas. "-" la operación ni siquiera compilaría para muchos tipos. Y para el conjunto compilado de tipos puede tener un error de desbordamiento numérico como se menciona en el comentario anterior –

Cuestiones relacionadas