Udostępnij za pośrednictwem


Sortowanie danych (C#)

Operacja sortowania porządkuje elementy sekwencji na podstawie co najmniej jednego atrybutu. Pierwsze kryterium sortowania wykonuje sortowanie podstawowe dla elementów. Określając drugie kryterium sortowania, można sortować elementy w każdej podstawowej grupie sortowania.

Ważne

Te przykłady używają System.Collections.Generic.IEnumerable<T> źródła danych. Źródła danych oparte na System.Linq.IQueryProvider System.Linq.IQueryable<T> źródłach danych i drzewach wyrażeń. Drzewa wyrażeń mają ograniczenia dotyczące dozwolonej składni języka C#. Ponadto każde IQueryProvider źródło danych, takie jak EF Core , może nakładać więcej ograniczeń. Zapoznaj się z dokumentacją źródła danych.

Poniższa ilustracja przedstawia wyniki operacji sortowania alfabetycznego w sekwencji znaków:

Grafika przedstawiająca operację sortowania alfabetycznego.

Standardowe metody operatorów zapytań, które sortują dane, są wymienione w poniższej sekcji.

Metody

Nazwa metody opis Składnia wyrażeń zapytań języka C# Więcej informacji
Kolejność według Sortuje wartości w kolejności rosnącej. orderby Enumerable.OrderBy

Queryable.OrderBy
OrderByDescending Sortuje wartości w kolejności malejącej. orderby … descending Enumerable.OrderByDescending

Queryable.OrderByDescending
Następnie Wykonuje sortowanie pomocnicze w kolejności rosnącej. orderby …, … Enumerable.ThenBy

Queryable.ThenBy
NastępnieByDescending Wykonuje sortowanie pomocnicze w kolejności malejącej. orderby …, … descending Enumerable.ThenByDescending

Queryable.ThenByDescending
Wycofaj Odwraca kolejność elementów w kolekcji. Nie dotyczy. Enumerable.Reverse

Queryable.Reverse

Uwaga

W poniższych przykładach w tym artykule użyto typowych źródeł danych dla tego obszaru.
Każdy z nich Student ma poziom klasy, dział podstawowy i serię wyników. Obiekt Teacher ma również właściwość identyfikującą City kampus, w którym nauczyciel posiada zajęcia. Element Department ma nazwę i odwołanie do osoby Teacher , która służy jako szef działu.
Przykładowy zestaw danych można znaleźć w repozytorium źródłowym.

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

Podstawowy sortowanie rosnące

W poniższym przykładzie pokazano, jak używać orderby klauzuli w zapytaniu LINQ w celu sortowania tablicy nauczycieli według nazwy rodziny w kolejności rosnącej.

IEnumerable<string> query = from teacher in teachers
                            orderby teacher.Last
                            select teacher.Last;

foreach (string str in query)
{
    Console.WriteLine(str);
}

Równoważne zapytanie napisane przy użyciu składni metody jest wyświetlane w następującym kodzie:

IEnumerable<string> query = teachers
    .OrderBy(teacher => teacher.Last)
    .Select(teacher => teacher.Last);

foreach (string str in query)
{
    Console.WriteLine(str);
}

Sortowanie malejące podstawowe

W następnym przykładzie pokazano, jak za pomocą klauzuli orderby descending w zapytaniu LINQ posortować nauczycieli według nazwy rodziny w kolejności malejącej.

IEnumerable<string> query = from teacher in teachers
                            orderby teacher.Last descending
                            select teacher.Last;

foreach (string str in query)
{
    Console.WriteLine(str);
}

Równoważne zapytanie napisane przy użyciu składni metody jest wyświetlane w następującym kodzie:

IEnumerable<string> query = teachers
    .OrderByDescending(teacher => teacher.Last)
    .Select(teacher => teacher.Last);

foreach (string str in query)
{
    Console.WriteLine(str);
}

Pomocnicze sortowanie rosnące

W poniższym przykładzie pokazano, jak używać klauzuli orderby w zapytaniu LINQ w celu wykonania sortowania podstawowego i pomocniczego. Nauczyciele są sortowani przede wszystkim przez miasto i po drugie według ich nazwiska rodzinnego, zarówno w kolejności rosnącej.

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

Równoważne zapytanie napisane przy użyciu składni metody jest wyświetlane w następującym kodzie:

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

Pomocniczy sortowanie malejące

W następnym przykładzie pokazano, jak użyć orderby descending klauzuli w zapytaniu LINQ w celu wykonania sortowania podstawowego w kolejności rosnącej i sortowania pomocniczego w kolejności malejącej. Nauczyciele są sortowani przede wszystkim przez miasto i po drugie według ich nazwiska rodzinnego.

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

Równoważne zapytanie napisane przy użyciu składni metody jest wyświetlane w następującym kodzie:

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

Zobacz też