Ordinamento dei dati (C#)

Un'operazione di ordinamento consente di ordinare gli elementi di una sequenza in base a uno o più attributi. Il primo criterio di ordinamento consente di applicare un ordinamento principale agli elementi. Specificando un secondo criterio di ordinamento, è possibile ordinare gli elementi all'interno di ogni gruppo di ordinamento principale.

La figura seguente illustra i risultati di un'operazione di ordinamento alfabetico in una sequenza di caratteri:

Immagine che illustra un'operazione di ordinamento alfabetico.

La sezione seguente elenca i metodi dell'operatore query standard che ordina i dati.

Metodi

Nome metodo Descrizione Sintassi di espressione della query C# Ulteriori informazioni
OrderBy Ordina i valori in ordine crescente. orderby Enumerable.OrderBy

Queryable.OrderBy
OrderByDescending Ordina i valori in ordine decrescente. orderby … descending Enumerable.OrderByDescending

Queryable.OrderByDescending
ThenBy Esegue un ordinamento secondario crescente. orderby …, … Enumerable.ThenBy

Queryable.ThenBy
ThenByDescending Esegue un ordinamento secondario decrescente. orderby …, … descending Enumerable.ThenByDescending

Queryable.ThenByDescending
Storna Inverte l'ordine degli elementi in una Collection. Non applicabile. Enumerable.Reverse

Queryable.Reverse

Gli esempi che seguono in questo articolo usano le origini dati comuni per questa area:

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

Ogni Student ha un livello di classe, un reparto primario e una serie di punteggi. Un Teacher ha anche una proprietà City che identifica il campus in cui l'insegnante tiene le lezioni. Un Department ha un nome e un riferimento a un Teacher che funge da responsabile del reparto.

Ordinamento primario crescente

L'esempio seguente illustra come utilizzare la clausola orderby in una query LINQ per ordinare l'array degli insegnanti in base al cognome, in ordine crescente.

IEnumerable<string> query = from teacher in teachers
                            orderby teacher.Last
                            select teacher.Last;

foreach (string str in query)
{
    Console.WriteLine(str);
}

La query equivalente scritta usando la sintassi del metodo è mostrata nel codice seguente:

IEnumerable<string> query = teachers
    .OrderBy(teacher => teacher.Last)
    .Select(teacher => teacher.Last);

foreach (string str in query)
{
    Console.WriteLine(str);
}

Ordinamento primario decrescente

Il prossimo esempio illustra come utilizzare la clausola orderby descending in una query LINQ per ordinare gli insegnanti in base al cognome, in ordine decrescente.

IEnumerable<string> query = from teacher in teachers
                            orderby teacher.Last descending
                            select teacher.Last;

foreach (string str in query)
{
    Console.WriteLine(str);
}

La query equivalente scritta usando la sintassi del metodo è mostrata nel codice seguente:

IEnumerable<string> query = teachers
    .OrderByDescending(teacher => teacher.Last)
    .Select(teacher => teacher.Last);

foreach (string str in query)
{
    Console.WriteLine(str);
}

Ordinamento secondario crescente

L'esempio seguente illustra come utilizzare la clausola orderby in una query LINQ per eseguire un ordinamento primario e secondario. Gli insegnanti sono ordinati primariamente per città e secondariamente per cognome, entrambi in ordine 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}");
}

La query equivalente scritta usando la sintassi del metodo è mostrata nel codice seguente:

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

Ordinamento secondario in ordine decrescente

L'esempio seguente illustra come usare la clausola orderby descending in una query LINQ per eseguire un ordinamento primario, in ordine crescente, e un ordinamento secondario, in ordine decrescente. Gli insegnanti sono ordinati primariamente per città e secondariamente per cognome.

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

La query equivalente scritta usando la sintassi del metodo è mostrata nel codice seguente:

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

Vedi anche