Classificando dados (C#)
Uma operação de classificação ordena os elementos de uma sequência com base em um ou mais atributos. O primeiro critério de classificação executa uma classificação primária dos elementos. Especificando um segundo critério de classificação, você pode classificar os elementos dentro de cada grupo de classificação primário.
Importante
Esses exemplos usam uma fonte de dados System.Collections.Generic.IEnumerable<T>. Fontes de dados baseadas em System.Linq.IQueryProvider usam as fontes de dados System.Linq.IQueryable<T> e as árvores de expressão. As árvores de expressão possuem limitações na sintaxe C# permitida. Além disso, todas as fontes de dados IQueryProvider
, como EF Core, podem impor mais restrições. Verifique a documentação da fonte de dados.
A ilustração a seguir mostra os resultados de uma operação de classificação alfabética em uma sequência de caracteres:
Os métodos de operador de consulta padrão que classificam dados estão listados na seção a seguir.
Métodos
Nome do método | Descrição | Sintaxe de expressão de consulta C# | Mais informações |
---|---|---|---|
OrderBy | Classifica valores em ordem crescente. | orderby |
Enumerable.OrderBy Queryable.OrderBy |
OrderByDescending | Classifica valores em ordem decrescente. | orderby … descending |
Enumerable.OrderByDescending Queryable.OrderByDescending |
ThenBy | Executa uma classificação secundária em ordem crescente. | orderby …, … |
Enumerable.ThenBy Queryable.ThenBy |
ThenByDescending | Executa uma classificação secundária em ordem decrescente. | orderby …, … descending |
Enumerable.ThenByDescending Queryable.ThenByDescending |
Reverse | Inverte a ordem dos elementos em uma coleção. | Não aplicável. | Enumerable.Reverse Queryable.Reverse |
Observação
Os exemplos a seguir neste artigo usam as fontes de dados comuns para essa área.
Cada Student
tem um nível de escolaridade, um departamento primário e uma série de pontuações. Um Teacher
também tem uma propriedade City
que identifica o campus onde o docente ministra aulas. A Department
tem um nome e uma referência a um Teacher
que atua como chefe do departamento.
Você pode encontrar o conjunto de dados de exemplo no repositório de origem.
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; }
}
Classificação crescente primária
O exemplo a seguir demonstra como usar a cláusula orderby
em uma consulta LINQ para classificar a matriz de professores por nome de família, em ordem crescente.
IEnumerable<string> query = from teacher in teachers
orderby teacher.Last
select teacher.Last;
foreach (string str in query)
{
Console.WriteLine(str);
}
A consulta equivalente escrita usando a sintaxe do método é mostrada no seguinte código:
IEnumerable<string> query = teachers
.OrderBy(teacher => teacher.Last)
.Select(teacher => teacher.Last);
foreach (string str in query)
{
Console.WriteLine(str);
}
Classificação decrescente primária
O exemplo a seguir demonstra como usar a cláusula orderby descending
em uma consulta LINQ para classificar os professores pelo nome da família, em ordem decrescente.
IEnumerable<string> query = from teacher in teachers
orderby teacher.Last descending
select teacher.Last;
foreach (string str in query)
{
Console.WriteLine(str);
}
A consulta equivalente escrita usando a sintaxe do método é mostrada no seguinte código:
IEnumerable<string> query = teachers
.OrderByDescending(teacher => teacher.Last)
.Select(teacher => teacher.Last);
foreach (string str in query)
{
Console.WriteLine(str);
}
Classificação crescente secundária
O exemplo a seguir demonstra como usar a cláusula orderby
em uma consulta LINQ para executar uma classificação primária e secundária. Os professores são classificados principalmente pela cidade e, em segundo lugar, pelo nome da família, ambos em ordem crescente.
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}");
}
A consulta equivalente escrita usando a sintaxe do método é mostrada no seguinte 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}");
}
Classificação decrescente secundária
O exemplo seguinte demonstra como usar a cláusula orderby descending
em uma consulta de LINQ para executar uma classificação primária, em ordem crescente e uma classificação secundária, em ordem decrescente. Os professores são classificados principalmente pela cidade e, em segundo lugar, pelo nome da família.
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}");
}
A consulta equivalente escrita usando a sintaxe do método é mostrada no seguinte 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}");
}