2010-06-17 13 views
66

Come posso ordinare la lista generica DESC e ASC? Con LINQ e senza LINQ? Sto usando VS2008.Come posso ordinare la lista generica DESC e 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(); 
    } 
} 

risposta

158

Con Linq

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

Senza Linq

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

Nota che senza Linq, la lista stessa è da ordinare. Con Linq, ottieni una lista ordinata della lista ma la lista stessa non è cambiata. Se si vuole mutare la lista, è necessario modificare i metodi di LINQ to qualcosa come

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

@onedaywhen Se ritieni che la risposta di un altro utente sia errata, dovresti commentare, votare e/o fornire una risposta che ritieni corretta, non modificare la risposta di un'altra persona in modo da essere ciò che ritieni sia corretto. – Servy

+12

Penso che per l'ordine discendente sia molto più chiaro usare 'li.Sort ((a, b) => b.CompareTo (a));' rispetto all'approccio '-1 *' usato qui. Ho modificato la risposta di conseguenza ma @Servy lo ha ripristinato. – onedaywhen

+0

@Servy: Penso che la risposta sia materialmente corretta ma in un caso ha usato una logica un po 'strana. Il [faq per la modifica] (http://stackoverflow.com/help/privileges/edit) dice: "Alcuni motivi comuni per modificare [include] ... per correggere errori minori". Sembra quindi che "modificare la risposta di un'altra persona in modo che sia ciò che pensi sia corretto" è incoraggiata (non proscritta, come suggerisci tu). – onedaywhen

13

con fuori LINQ, uso Sort() e poi Reverse() esso.

48

Senza Linq:

Ascendente:

li.Sort(); 

Discendente:

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

'Sort()' è un metodo void, quindi non puoi concatenare 'Reverse() 'in questo modo. Avrai bisogno di 2 operazioni separate. Tuttavia, con LINQ è possibile associarlo a un "Ordine", ma a quel punto dovresti semplicemente usare "OrderByDescending". –

+0

@Ahmad Mageed. Ofcourse ... fusione del tardo pomeriggio ... :( –

+0

Questo è semplice e funziona per me, e il mio codice di ordinamento esistente –

-1

modo molto semplice per ordinare List con valori int in ordine decrescente:

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

Speranza quello Questo aiuta!

+3

Questo non è ciò che 'int.CompareTo (int)' porta una ragione. all'indirizzo referencesource.microsoft.com] (http://referencesource.microsoft.com/#mscorlib/system/int32.cs,225942ed7b7a3252) che dice: "* È necessario utilizzare il confronto perché la sottrazione si trasformerà in positiva per numeri negativi molto grandi, ecc. * ". Se hai' b = int.MinValue' e 'a = 1' (dire), questo fallirà.A volte vale la pena chiamare un metodo. –

+0

* per un motivo ... –

+0

La domanda dice sull'ordinamento delle liste generiche. L'operazione "-" non sarebbe nemmeno compilata per molti tipi. E per set di tipi compilati puoi avere un errore di overflow numerico come menzionato nel commento precedente –

Problemi correlati