Jak posortować listę ogólną DESC i ASC?

110

Jak posortować listę ogólną DESC i ASC? Z LINQ i bez LINQ? Używam 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
źródło

Odpowiedzi:

246

Dzięki Linq

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

Bez Linq

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

Zauważ, że bez Linq, sama lista jest sortowana. Dzięki Linq otrzymujesz uporządkowaną wyliczalną listę, ale sama lista się nie zmieniła. Jeśli chcesz zmodyfikować listę, zmień metody Linq na coś podobnego

li = li.OrderBy(i => i).ToList();
Anthony Pegram
źródło
1
@onedaywhen Jeśli uważasz, że odpowiedź innego użytkownika jest nieprawidłowa, powinieneś komentować, głosować i / lub udzielać odpowiedzi, którą uważasz za poprawną, nie edytując odpowiedzi innej osoby tak, aby była poprawna.
Servy
24
Myślę, że dla porządku malejącego jest znacznie jaśniejszy w użyciu li.Sort((a, b) => b.CompareTo(a));niż -1*podejście zastosowane tutaj. Odpowiednio zredagowałem odpowiedź, ale @Servy ją cofnął.
kiedy
9
@onedaywhen Kiedy autor popełnił błąd w zapisywaniu tego, co zamierzał, zmiana tego na to, co zamierzał napisać, jest w porządku. Zmiana kodu z tego, co ktoś inny pomyślał, że rozwiązaniem powinno być zastosowanie innego podejścia, które Twoim zdaniem powinno być zamiast tego użyte, nie jest odpowiednią edycją.
Servy
5
@onedaywhen Sure; zobaczysz to wszędzie tam, gdzie zobaczysz opisaną edycję. Z centrum pomocy: „Kiedy należy edytować posty? [...] Aby wyjaśnić znaczenie posta (bez zmiany tego znaczenia)”
Servy
4
Albo po prostu -a.CompareTo(b).
Shimmy Weitzhandler
72

Bez Linq:

Rosnąco:

li.Sort();

Malejąco:

li.Sort();
li.Reverse();
Sani Singh Huttunen
źródło
Sort()jest metodą void, więc nie możesz połączyć z Reverse()nią w ten sposób. Będziesz potrzebować 2 oddzielnych operacji. Jednak w przypadku LINQ można połączyć go z plikiem, OrderByale w tym momencie należy po prostu użyć OrderByDescending.
Ahmad Mageed
20

bez linq, użyj, Sort()a potem Reverse()to.

Srinivas Reddy Thatiparthy
źródło
3

Sprawdzałem wszystkie powyższe odpowiedzi i chciałem dodać jeszcze jedną dodatkową informację. Chciałem posortować listę w kolejności DESC i szukałem rozwiązania, które jest szybsze dla większych wejść i korzystałem wcześniej z tej metody: -

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

ale moje przypadki testowe zawodziły z powodu przekroczenia limitów czasowych, więc poniższe rozwiązanie działało dla mnie: -

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

Ostatecznie wniosek jest taki, że drugi sposób sortowania listy w porządku malejącym jest nieco szybszy niż poprzedni.

sarawgeek
źródło
-3

Bardzo prosty sposób sortowania listy z wartościami int w porządku malejącym:

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

Mam nadzieję, że to pomoże!

Sunil Murali
źródło
4
To nie int.CompareTo(int)jest powód do drzwi. Zobacz źródło na referenceource.microsoft.com, gdzie jest napisane: „Należy użyć porównania, ponieważ odejmowanie będzie zawierać wartości dodatnie w przypadku bardzo dużych liczb ujemnych itp .”. Jeśli masz b = int.MinValuei a = 1(powiedzmy), to się nie powiedzie. Czasami warto wywołać metodę.
Wai Ha Lee
Pytanie dotyczy sortowania list rodzajowych. Operacja „-” nie skompilowałaby się nawet dla wielu typów. I dla skompilowany zestaw typów można mieć numeryczny błąd przepełnienia jak wspomniano w komentarzu przed
Vadim Levkovsky