Ordenación de datos (C#)

Una operación de ordenación ordena los elementos de una secuencia según uno o varios atributos. El primer criterio de ordenación realiza una ordenación primaria de los elementos. Al especificar un segundo criterio de ordenación, se pueden ordenar los elementos dentro de cada grupo de ordenación primaria.

Importante

Estos ejemplos usan un origen de datos System.Collections.Generic.IEnumerable<T>. Los orígenes de datos basados en System.Linq.IQueryProvider usanSystem.Linq.IQueryable<T> orígenes de datos y árboles de expresión . Los árboles de expresión tienen limitaciones en la sintaxis de C# permitida. Además, cada origen de datos IQueryProvider, como EF Core puede imponer más restricciones. Compruebe la documentación del origen de datos.

En la ilustración siguiente se muestran los resultados de una operación de ordenación alfabética en una secuencia de caracteres:

Gráfico que muestra una operación de ordenación alfabética.

Los métodos de operador de consulta estándar que ordenan datos de datos se enumeran en la sección siguiente.

Métodos

Nombre del método Descripción Sintaxis de la expresión de consulta de C# Más información
OrderBy Ordena valores en orden ascendente. orderby Enumerable.OrderBy

Queryable.OrderBy
OrderByDescending Ordena valores en orden descendente. orderby … descending Enumerable.OrderByDescending

Queryable.OrderByDescending
ThenBy Realiza una ordenación secundaria en orden ascendente. orderby …, … Enumerable.ThenBy

Queryable.ThenBy
ThenByDescending Realiza una ordenación secundaria en orden descendente. orderby …, … descending Enumerable.ThenByDescending

Queryable.ThenByDescending
Reverse Invierte el orden de los elementos de una colección. No aplicable. Enumerable.Reverse

Queryable.Reverse

Nota:

En los ejemplos siguientes de este artículo se usan los orígenes de datos comunes para esta área.
Cada Student tiene un nivel académico, un departamento principal y una serie de puntuaciones. Un Teacher también tiene una propiedad City que identifica el campus donde el profesor imparte clases. Un Department tiene un nombre y una referencia a un Teacher que actúa como jefe del departamento.
Puede encontrar el conjunto de datos de ejemplo en el repositorio de origen.

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

Orden ascendente principal

El siguiente ejemplo muestra cómo usar la cláusula orderby en una consulta LINQ para ordenar la matriz de profesores por apellido, en orden ascendente.

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

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

La consulta equivalente escrita usando la sintaxis del método se muestra en el siguiente código:

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

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

Orden descendente principal

El siguiente ejemplo muestra cómo usar la cláusula orderby descending en una consulta LINQ para ordenar a los profesores por apellido, en orden descendente.

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

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

La consulta equivalente escrita usando la sintaxis del método se muestra en el siguiente código:

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

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

Orden ascendente secundario

En el siguiente ejemplo se muestra cómo usar la cláusula orderby en una consulta LINQ para realizar una ordenación principal y secundaria. Los profesores se ordenan principalmente por ciudad y en segundo lugar por su apellido, ambos en orden ascendente.

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

La consulta equivalente escrita usando la sintaxis del método se muestra en el siguiente código:

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

Orden descendente secundario

En el siguiente ejemplo se muestra cómo usar la cláusula orderby descending en una consulta LINQ para realizar una ordenación principal en orden ascendente y una ordenación secundaria en orden descendente. Los profesores se ordenan principalmente por ciudad y en segundo lugar por su apellido.

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

La consulta equivalente escrita usando la sintaxis del método se muestra en el siguiente código:

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

Consulte también