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

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

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

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


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.


-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!


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.