Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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 |
| OrdinaInModoDecrescente (OrderByDescending) | Ordina i valori in ordine decrescente. | orderby … descending |
Enumerable.OrderByDescending Queryable.OrderByDescending |
| ThenBy | Esegue un ordinamento secondario crescente. | orderby …, … |
Enumerable.ThenBy Queryable.ThenBy |
| PoiPerOrdineDecrescente | 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; }
}
Nota
È possibile fare riferimento alle origini dati comuni per questa area nell'articolo Panoramica degli operatori di query standard .
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}");
}