Sortieren von Daten (C#)
Bei einem Sortiervorgang werden die Elemente einer Sequenz auf Grundlage eines oder mehrerer Attribute sortiert. Mit dem ersten Sortierkriterium wird eine primäre Sortierung der Elemente ausgeführt. Sie können die Elemente innerhalb jeder primären Sortiergruppe sortieren, indem Sie ein zweites Sortierkriterium angeben.
Wichtig
In diesen Beispielen wird eine System.Collections.Generic.IEnumerable<T>-Datenquelle verwendet. Datenquellen, die auf System.Linq.IQueryProvider basieren, verwenden System.Linq.IQueryable<T>-Datenquellen und Ausdrucksbaumstrukturen. Ausdrucksbaumstrukturen haben Einschränkungen für die zulässige C#-Syntax. Darüber hinaus kann jede IQueryProvider
-Datenquelle, z. B. EF Core, weitere Einschränkungen erzwingen. Konsultieren Sie die Dokumentation für Ihre Datenquelle.
Die folgende Abbildung zeigt das Ergebnis eines alphabetischen Sortiervorgangs bei einer Zeichensequenz:
Die Methoden des Standardabfrageoperators, die Daten sortieren, sind im folgenden Abschnitt aufgeführt.
Methoden
Methodenname | Beschreibung | C#-Abfrageausdruckssyntax | Weitere Informationen |
---|---|---|---|
OrderBy | Sortiert Werte in aufsteigender Reihenfolge | orderby |
Enumerable.OrderBy Queryable.OrderBy |
OrderByDescending | Sortiert Werte in absteigender Reihenfolge | orderby … descending |
Enumerable.OrderByDescending Queryable.OrderByDescending |
ThenBy | Führt eine sekundäre Sortierung in aufsteigender Reihenfolge durch | orderby …, … |
Enumerable.ThenBy Queryable.ThenBy |
ThenByDescending | Führt eine sekundäre Sortierung in absteigender Reihenfolge durch | orderby …, … descending |
Enumerable.ThenByDescending Queryable.ThenByDescending |
Reverse | Kehrt die Reihenfolge der Elemente in einer Auflistung um | Nicht zutreffend. | Enumerable.Reverse Queryable.Reverse |
Hinweis
In den folgenden Beispielen in diesem Artikel werden die allgemeinen Datenquellen für diesen Bereich verwendet.
Allen Student
sind eine Klassenstufe, ein primärer Fachbereich und mehrere Bewertungen zugeordnet. Teacher
verfügen auch über eine City
-Eigenschaft, die den Campus identifiziert, auf dem die Lehrkraft unterrichtet. Eine Department
hat einen Namen und einen Verweis auf eine Teacher
, die den Fachbereich leitet.
Sie finden das Beispieldatensatz im Quell-Repository.
public enum GradeLevel
{
FirstYear = 1,
SecondYear,
ThirdYear,
FourthYear
};
public class Student
{
public required string FirstName { get; init; }
public required string LastName { get; init; }
public required int ID { get; init; }
public required GradeLevel Year { get; init; }
public required List<int> Scores { get; init; }
public required int DepartmentID { get; init; }
}
public class Teacher
{
public required string First { get; init; }
public required string Last { get; init; }
public required int ID { get; init; }
public required string City { get; init; }
}
public class Department
{
public required string Name { get; init; }
public int ID { get; init; }
public required int TeacherID { get; init; }
}
Primäre aufsteigende Sortierung
Im folgenden Beispiel wird veranschaulicht, wie die orderby
-Klausel in einer LINQ-Abfrage verwendet wird, um das Array von Lehrkräften nach Nachname in aufsteigender Reihenfolge zu sortieren.
IEnumerable<string> query = from teacher in teachers
orderby teacher.Last
select teacher.Last;
foreach (string str in query)
{
Console.WriteLine(str);
}
Die entsprechende Abfrage, die mit Methodensyntax geschrieben wurde, ist im folgenden Code dargestellt:
IEnumerable<string> query = teachers
.OrderBy(teacher => teacher.Last)
.Select(teacher => teacher.Last);
foreach (string str in query)
{
Console.WriteLine(str);
}
Primäre absteigende Sortierung
Im nächsten Beispiel wird veranschaulicht, wie Sie die orderby descending
-Klausel in einer LINQ-Abfrage verwenden, um die Lehrkräfte in absteigender Reihenfolge nach ihrem Nachnamen zu sortieren.
IEnumerable<string> query = from teacher in teachers
orderby teacher.Last descending
select teacher.Last;
foreach (string str in query)
{
Console.WriteLine(str);
}
Die entsprechende Abfrage, die mit Methodensyntax geschrieben wurde, ist im folgenden Code dargestellt:
IEnumerable<string> query = teachers
.OrderByDescending(teacher => teacher.Last)
.Select(teacher => teacher.Last);
foreach (string str in query)
{
Console.WriteLine(str);
}
Sekundäre aufsteigende Sortierung
Im folgenden Beispiel wird veranschaulicht, wie Sie die orderby
-Klausel in einer LINQ-Abfrage verwenden, um eine primäre und eine sekundäre Sortierung durchzuführen. Die Lehrkräfte werden zuerst nach der Stadt und dann nach ihrem Nachnamen sortiert – jeweils in aufsteigender Reihenfolge.
IEnumerable<(string, string)> query = from teacher in teachers
orderby teacher.City, teacher.Last
select (teacher.Last, teacher.City);
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}
Die entsprechende Abfrage, die mit Methodensyntax geschrieben wurde, ist im folgenden Code dargestellt:
IEnumerable<(string, string)> query = teachers
.OrderBy(teacher => teacher.City)
.ThenBy(teacher => teacher.Last)
.Select(teacher => (teacher.Last, teacher.City));
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}
Sekundäre absteigende Sortierung
Im nächsten Beispiel wird gezeigt, wie man die orderby descending
-Klausel in einer LINQ-Abfrage verwendet, um eine primäre Sortierung in aufsteigender Reihenfolge und eine sekundäre Sortierung in absteigender Reihenfolge durchzuführen. Die Lehrkräfte werden zuerst nach der Stadt und dann nach ihrem Nachnamen sortiert.
IEnumerable<(string, string)> query = from teacher in teachers
orderby teacher.City, teacher.Last descending
select (teacher.Last, teacher.City);
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}
Die entsprechende Abfrage, die mit Methodensyntax geschrieben wurde, ist im folgenden Code dargestellt:
IEnumerable<(string, string)> query = teachers
.OrderBy(teacher => teacher.City)
.ThenByDescending(teacher => teacher.Last)
.Select(teacher => (teacher.Last, teacher.City));
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}