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 nos 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 System.Collections.Generic.IEnumerable<T> dados. Fontes de dados baseadas em System.Linq.IQueryProvider fontes de dados de uso System.Linq.IQueryable<T> e árvores de expressão. As árvores de expressão têm limitações na sintaxe C# permitida. Além disso, cada IQueryProvider
fonte de dados, como o EF Core , pode impor mais restrições. Verifique a documentação da sua 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 | Description | Sintaxe da expressão de consulta C# | Mais Informações |
---|---|---|---|
OrderBy | Classifica os valores em ordem crescente. | orderby |
Enumerable.OrderBy Queryable.OrderBy |
OrderByDescending | Classifica os valores em ordem decrescente. | orderby … descending |
Enumerable.OrderByDescending Queryable.OrderByDescending |
EntãoPor | Executa uma classificação secundária em ordem crescente. | orderby …, … |
Enumerable.ThenBy Queryable.ThenBy |
EntãoPorDescendente | Executa uma classificação secundária em ordem decrescente. | orderby …, … descending |
Enumerable.ThenByDescending Queryable.ThenByDescending |
Inverter | Inverte a ordem dos elementos em uma coleção. | Não aplicável. | Enumerable.Reverse Queryable.Reverse |
Nota
Os exemplos a seguir neste artigo usam as fontes de dados comuns para essa área.
Cada Student
um tem um nível de nota, um departamento primário e uma série de pontuações. A Teacher
também tem uma City
propriedade que identifica o campus onde o professor tem aulas. A Department
tem um nome, e uma referência a um Teacher
que serve como chefe de 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 Primária Ascendente
O exemplo a seguir demonstra como usar a orderby
cláusula 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 sintaxe de método é mostrada no código a seguir:
IEnumerable<string> query = teachers
.OrderBy(teacher => teacher.Last)
.Select(teacher => teacher.Last);
foreach (string str in query)
{
Console.WriteLine(str);
}
Classificação Descendente Primária
O próximo exemplo demonstra como usar a orderby descending
cláusula em uma consulta LINQ para classificar os professores por nome de 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 sintaxe de método é mostrada no código a seguir:
IEnumerable<string> query = teachers
.OrderByDescending(teacher => teacher.Last)
.Select(teacher => teacher.Last);
foreach (string str in query)
{
Console.WriteLine(str);
}
Classificação Secundária Ascendente
O exemplo a seguir demonstra como usar a orderby
cláusula em uma consulta LINQ para executar uma classificação primária e secundária. Os professores são ordenados principalmente por cidade e secundariamente pelo seu nome de 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 sintaxe de método é mostrada no código a seguir:
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 Secundária Descendente
O próximo exemplo demonstra como usar a orderby descending
cláusula em uma consulta LINQ para executar uma classificação primária, em ordem crescente, e uma classificação secundária, em ordem decrescente. Os professores são ordenados principalmente por cidade e secundariamente pelo seu nome de 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 sintaxe de método é mostrada no código a seguir:
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}");
}