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:

Gráfico que mostra uma operação de classificação alfabética.

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

Confira também