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.

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

Os seguintes exemplos neste artigo usam as fontes de dados comuns para esta área:

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

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. Um Department tem um nome, e uma referência a um Teacher que serve como o chefe do departamento.

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