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.
Importante
In questi esempi viene usata un'origine dati System.Collections.Generic.IEnumerable<T>. Le origini dati basate su System.Linq.IQueryProvider usano origini dati System.Linq.IQueryable<T> e alberi delle espressioni. La sintassi consentita per gli alberi delle espressioni presenta limitazioni. Inoltre, ogni origine dati IQueryProvider
, ad esempio EF Core può imporre altre restrizioni. Consultare la documentazione relativa all'origine dati.
La figura seguente illustra i risultati di un'operazione di ordinamento alfabetico in una sequenza di caratteri:
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 |
Nota
Gli esempi seguenti in questo articolo usano le origini dati comuni per questa area.
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.
È possibile trovare il set di dati di esempio nel repository di origine.
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; }
}
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}");
}