Come posso ordinare elenchi generici DESC e ASC?


110

Come posso ordinare elenchi generici DESC e ASC? Con LINQ e senza LINQ? Sto 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();
    }
}

Risposte:


246

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

Notare che senza Linq, l'elenco stesso viene ordinato. Con Linq, ottieni un enumerabile ordinato dell'elenco ma l'elenco stesso non è cambiato. Se vuoi modificare l'elenco, cambierai i metodi di Linq in qualcosa di simile

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

1
@onedaywhen Se ritieni che la risposta di un altro utente non sia corretta, dovresti commentare, votare e / o fornire una risposta che ritieni corretta, non modificare la risposta di un'altra persona in modo che sia quella che ritieni corretta.
Servizio

24
Penso che per l'ordine decrescente sia molto più chiaro da usare li.Sort((a, b) => b.CompareTo(a));rispetto -1*all'approccio usato qui. Ho modificato la risposta di conseguenza ma @Servy l'ha ripristinata.
giorno del

9
@onedaywhen Quando l'autore ha commesso un errore nello scrivere ciò che intendeva, cambiarlo in modo che fosse ciò che intendeva scrivere va bene. Cambiare la forma del codice come qualcun altro ha pensato che la soluzione dovrebbe essere l'utilizzo di un approccio diverso che ritieni debba essere utilizzato invece non è una modifica appropriata.
Servy

5
@onedaywhen Sure; lo vedrai ovunque vedrai la modifica descritta. Dal centro assistenza, "Quando devo modificare i post? [...] Per chiarire il significato del post (senza cambiarlo)"
Servy

4
O semplicemente -a.CompareTo(b).
Shimmy Weitzhandler

72

Senza Linq:

Ascendente:

li.Sort();

Discendente:

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

Sort()è un metodo void, quindi non puoi concatenarlo Reverse()in questo modo. Avrai bisogno di 2 operazioni separate. Tuttavia, con LINQ potresti concatenarlo a un, OrderByma a quel punto dovresti semplicemente usarlo OrderByDescending.
Ahmad Mageed


3

Stavo controllando tutte le risposte sopra e volevo aggiungere un'altra informazione aggiuntiva. Volevo ordinare l'elenco in ordine DESC e stavo cercando la soluzione che è più veloce per input più grandi e stavo usando questo metodo in precedenza: -

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

ma i miei casi di test non hanno superato i limiti di tempo, quindi la soluzione di seguito ha funzionato per me: -

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

Quindi, in definitiva, la conclusione è che il secondo modo di ordinare gli elenchi in ordine decrescente è leggermente più veloce del precedente.


-3

Modo molto semplice per ordinare l'elenco con valori int in ordine decrescente:

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

Spero che questo aiuti!


4
Questo non è ciò che int.CompareTo(int)fa porta una ragione. Vedere la fonte su referencesource.microsoft.com che dice: "È necessario utilizzare il confronto perché la sottrazione andrà a capo in positivo per numeri negativi molto grandi, ecc .". Se hai b = int.MinValuee a = 1(diciamo), questo fallirà. A volte vale la pena chiamare un metodo.
Wai Ha Lee

Domanda dice sull'ordinamento di elenchi generici. L'operazione "-" non viene nemmeno compilata per molti tipi. E per il set di tipi compilato puoi avere un errore di overflow numerico come menzionato nel commento prima
Vadim Levkovsky
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.