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