Freigeben über


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:

Grafik, die einen alphabetischen Sortiervorgang zeigt.

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

Siehe auch