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:

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

Consulte também