List<T> in C# sortieren: Vom Chaos zur Ordnung in 5 Minuten
\n\nStellen Sie sich vor: Sie haben eine Liste von Benutzern und müssen sie in alphabetischer Reihenfolge nach Nachnamen anzeigen. Oder eine Liste von Produkten – sortiert nach Preis von günstig zu teuer. Eine bekannte Aufgabe? Auf Stack Overflow hat die Frage „How to Sort a List<T> by a property in the object“ Tausende von Aufrufen gesammelt – das bedeutet, dieses Thema beschäftigt viele Entwickler.
\n\nIn diesem Artikel behandeln wir fünf Methoden zum Sortieren einer Liste in C#. Sie erfahren, wie Sie nach einer Eigenschaft, nach mehreren Feldern sortieren und wie Sie die Sortierung so schnell wie möglich gestalten. Los geht's!
\n\nWas wir sortieren werden: Die Klasse User
\n\nFür die Beispiele nehmen wir ein einfaches Datenmodell – einen Benutzer mit Name, Alter und Bewertung.
\n\npublic class User\n{\n public string Name { get; set; }\n public int Age { get; set; }\n public double Rating { get; set; }\n\n public override string ToString()\n {\n return $"{Name} ({Age}) — {Rating:F2}";\n }\n}\n\nErstellen wir eine Testliste:
\n\nList<User> users = new List<User>\n{\n new User { Name = "Anna", Age = 30, Rating = 4.5 },\n new User { Name = "Boris", Age = 25, Rating = 3.8 },\n new User { Name = "Viktor", Age = 35, Rating = 4.9 },\n new User { Name = "Galina", Age = 28, Rating = 4.2 }\n};\n\nMethode 1: LINQ OrderBy – die einfachste und eleganteste
\n\nWenn Sie List<T> nach einer Objekteigenschaft sortieren möchten, schnell und ohne überflüssigen Code – verwenden Sie LINQ. Die Methode OrderBy erstellt eine neue geordnete Sequenz, ohne die ursprüngliche Liste zu verändern. Dies ist ideal, wenn eine Sortierung „im laufenden Betrieb“ benötigt wird.
// Sortierung nach Name (aufsteigend)\nvar sortedByName = users.OrderBy(u => u.Name).ToList();\n\n// Sortierung nach Alter (absteigend)\nvar sortedByAgeDesc = users.OrderByDescending(u => u.Age).ToList();\n\n// Sortierung nach mehreren Feldern: zuerst nach Alter, dann nach Bewertung\nvar sortedMulti = users\n .OrderBy(u => u.Age)\n .ThenBy(u => u.Rating)\n .ToList();\n\nVorteile: Lesbarkeit, Sortierketten, funktioniert mit beliebigen Eigenschaftstypen.
\nNachteile: Erstellt eine neue Liste (zusätzlicher Speicher).
Methode 2: List.Sort mit Comparison-Delegat – Sortierung an Ort und Stelle
\n\nWenn Sie eine C#-Liste sortieren möchten, ohne eine Kopie zu erstellen (Speicherersparnis), verwenden Sie die Methode Sort mit einem Lambda-Ausdruck. Diese Methode verändert die ursprüngliche Sammlung.
// Sortierung nach Name (an Ort und Stelle)\nusers.Sort((a, b) => string.Compare(a.Name, b.Name, StringComparison.Ordinal));\n\n// Sortierung nach Alter (absteigend)\nusers.Sort((a, b) => b.Age.CompareTo(a.Age));\n\n// Sortierung nach Bewertung\nusers.Sort((a, b) => a.Rating.CompareTo(b.Rating));\n\nVorteile: Erstellt kein neues Objekt, schneller für große Listen.
\nNachteile: Weniger lesbar bei komplexer Sortierung.
Methode 3: Implementierung von IComparable – Sortierung „von Haus aus“
\n\nWenn Ihre Klasse immer nach demselben Feld sortiert werden soll (z. B. nach Name), implementieren Sie das Interface IComparable<T>. Dann funktioniert List.Sort() ohne Argumente.
public class User : IComparable<User>\n{\n // ... Eigenschaften aus dem obigen Beispiel ...\n\n public int CompareTo(User other)\n {\n if (other == null) return 1;\n return string.Compare(this.Name, other.Name, StringComparison.Ordinal);\n }\n}\n\n// Verwendung\nusers.Sort(); // automatisch nach Name\n\nVorteile: Natürliche Sortierung für die Geschäftslogik.
\nNachteile: Legt eine Regel fest – für andere Felder muss separate Logik geschrieben werden.