Wie kann ich generische Listen DESC und ASC sortieren?

110

Wie kann ich generische Listen DESC und ASC sortieren? Mit LINQ und ohne LINQ? Ich benutze 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
quelle

Antworten:

245

Mit Linq

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

Ohne Linq

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

Beachten Sie, dass ohne Linq die Liste selbst sortiert wird. Mit Linq erhalten Sie eine geordnete Aufzählung der Liste, aber die Liste selbst hat sich nicht geändert. Wenn Sie die Liste mutieren möchten, ändern Sie die Linq-Methoden in etwas wie

li = li.OrderBy(i => i).ToList();
Anthony Pegram
quelle
1
@onedaywhen Wenn Sie der Meinung sind, dass die Antwort eines anderen Benutzers falsch ist, sollten Sie kommentieren, abstimmen und / oder eine Antwort bereitstellen, die Sie für richtig halten, und die Antwort einer anderen Person nicht so bearbeiten, wie Sie es für richtig halten.
Servy
24
Ich denke, dass es in absteigender Reihenfolge viel klarer ist li.Sort((a, b) => b.CompareTo(a));als der -1*hier verwendete Ansatz. Ich habe die Antwort entsprechend bearbeitet, aber @Servy hat sie zurückgesetzt.
Tag, wenn
9
@onedaywhen Wenn der Autor einen Fehler beim Aufschreiben seiner Absichten gemacht hat, ist es in Ordnung, ihn in das zu ändern, was er schreiben wollte. Das Ändern der Codeform, von der jemand anderes dachte, dass die Lösung darin bestehen sollte, einen anderen Ansatz zu verwenden, der Ihrer Meinung nach stattdessen verwendet werden sollte, ist keine geeignete Bearbeitung.
Servy
5
@onedaywhen Sicher; Sie sehen es überall dort, wo Sie die beschriebene Bearbeitung sehen. In der Hilfe: "Wann sollte ich Beiträge bearbeiten? [...] Um die Bedeutung des Beitrags zu klären (ohne diese Bedeutung zu ändern)"
Servy
4
Oder einfach nur -a.CompareTo(b).
Shimmy Weitzhandler
72

Ohne Linq:

Aufsteigend:

li.Sort();

Absteigend:

li.Sort();
li.Reverse();
Sani Singh Huttunen
quelle
Sort()ist eine void-Methode, daher können Sie sie nicht Reverse()auf diese Weise verketten. Sie benötigen 2 separate Operationen. Mit LINQ können Sie es jedoch an ein verketten, OrderByaber an diesem Punkt sollten Sie OrderByDescendingstattdessen einfach verwenden .
Ahmad Mageed
20

ohne linq verwenden Sort()und dann Reverse()es.

Srinivas Reddy Thatiparthy
quelle
3

Ich habe alle obigen Antworten überprüft und wollte noch eine weitere Information hinzufügen. Ich wollte die Liste in DESC-Reihenfolge sortieren und suchte nach einer Lösung, die für größere Eingaben schneller ist, und habe diese Methode früher verwendet: -

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

Da meine Testfälle jedoch die Zeitlimits nicht überschritten haben, hat die folgende Lösung für mich funktioniert: -

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

Letztendlich ist die Schlussfolgerung, dass die zweite Art der Sortierung der Liste in absteigender Reihenfolge etwas schneller ist als die vorherige.

sarawgeek
quelle
-3

Sehr einfache Methode zum Sortieren von Listen mit int-Werten in absteigender Reihenfolge:

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

Hoffe das hilft!

Sunil Murali
quelle
4
Dies ist nicht der int.CompareTo(int)Grund für eine Tür. Siehe die Quelle unter referencesource.microsoft.com, in der steht: " Vergleichen muss verwendet werden, da die Subtraktion für sehr große negative Zahlen usw. positiv wird. " Wenn Sie b = int.MinValueund a = 1(sagen wir) haben, wird dies fehlschlagen. Manchmal lohnt sich ein Methodenaufruf.
Wai Ha Lee
Frage sagt über das Sortieren von generischen Listen. Die Operation "-" würde nicht einmal für viele Typen kompiliert werden. Und für kompilierte
Sätze