0Pricing
C# Academy · Lezione

OrderBy e raggruppamento

Ordini e raggruppi i risultati

OrderBy e raggruppamento è una lezione C# Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C# Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C# Academy include 4 lezioni in totale.

Ordinamento con OrderBy

OrderBy ordina una sequenza in ordine crescente in base a una chiave selezionata. La lambda restituisce il valore su cui eseguire l'ordinamento.

Restituisce una nuova sequenza ordinata ed è stabile, cioè gli elementi con chiavi uguali mantengono il rispettivo ordine relativo originale.

using System;
using System.Linq;

int[] nums = { 4, 1, 3, 2 };
var sorted = nums.OrderBy(n => n);
Console.WriteLine(string.Join(", ", sorted));

Ordinamento decrescente

OrderByDescending ordina dalla chiave più grande a quella più piccola.

Lo utilizzi direttamente invece di ordinare in modo crescente e poi invertire l'ordine: esprime chiaramente l'intento ed esegue l'ordinamento in un'unica passata.

using System;
using System.Linq;

int[] scores = { 70, 95, 60, 88 };
var ranked = scores.OrderByDescending(s => s);
Console.WriteLine(string.Join(", ", ranked));

Ordinare per proprietà

Per gli oggetti, selezioni la proprietà in base alla quale ordinare. OrderBy(p => p.Age) ordina le persone dalla più giovane alla più anziana.

La chiave può essere di qualsiasi tipo confrontabile — numeri, stringhe, date — o di qualsiasi tipo che implementi IComparable.

using System;
using System.Linq;
using System.Collections.Generic;

record P(string Name, int Age);
var people = new List<P> { new("Ana", 30), new("Bo", 22) };
var byAge = people.OrderBy(p => p.Age);
foreach (var p in byAge) Console.WriteLine(p.Name);

Ordinamento secondario con ThenBy

ThenBy aggiunge un criterio di spareggio. Dopo OrderBy, ordina gli elementi che condividono la chiave primaria in base a una seconda chiave.

È possibile concatenare diverse chiamate a ThenBy/ThenByDescending per un ordinamento su più livelli.

using System;
using System.Linq;
using System.Collections.Generic;

record P(string Name, int Age);
var people = new List<P> { new("Bo", 30), new("Ana", 30), new("Cy", 22) };
var ordered = people.OrderBy(p => p.Age).ThenBy(p => p.Name);
foreach (var p in ordered) Console.WriteLine($"{p.Age} {p.Name}");

Perché non usare un secondo OrderBy

Invocare OrderBy due volte non fornisce un criterio di spareggio: la seconda chiamata riordina completamente gli elementi e scarta il primo ordinamento.

Per un ordinamento a più livelli, usi sempre ThenBy dopo il primo OrderBy.

using System;
using System.Linq;
using System.Collections.Generic;

record P(string N, int A);
var ps = new List<P> { new("Bo", 30), new("Ana", 30) };
var wrong = ps.OrderBy(p => p.A).OrderBy(p => p.N);
foreach (var p in wrong) Console.WriteLine(p.N);

La clausola orderby nella sintassi delle query

La sintassi delle query offre una clausola orderby. Elenchi più chiavi separate da virgole, specificando facoltativamente descending.

orderby p.Age, p.Name descending ordina prima per età e, in caso di parità, per nome in ordine inverso.

using System;
using System.Linq;
using System.Collections.Generic;

record P(string N, int A);
var ps = new List<P> { new("Bo", 30), new("Ana", 30), new("Cy", 22) };
var q = from p in ps orderby p.A, p.N select p.N;
Console.WriteLine(string.Join(", ", q));

Raggruppamento con GroupBy

GroupBy suddivide una sequenza in gruppi che condividono una chiave. Restituisce una sequenza di IGrouping<TKey, TElement>.

Ogni raggruppamento espone la propria Key ed è a sua volta iterabile sugli elementi di quel gruppo.

using System;
using System.Linq;

int[] nums = { 1, 2, 3, 4, 5, 6 };
var groups = nums.GroupBy(n => n % 2 == 0 ? "even" : "odd");
foreach (var g in groups)
  Console.WriteLine($"{g.Key}: {string.Join(\",\", g)}");

Chiave e membri del gruppo

La Key di ogni gruppo identifica la partizione e l'iterazione sul gruppo restituisce i relativi membri. È possibile chiamare direttamente Count() su un gruppo.

È così che si costruiscono istogrammi, conteggi e suddivisioni per categoria.

using System;
using System.Linq;

string[] fruit = { "apple", "avocado", "banana", "cherry" };
var byLetter = fruit.GroupBy(f => f[0]);
foreach (var g in byLetter)
  Console.WriteLine($"{g.Key}: {g.Count()}");

Raggruppare e poi proiettare

Un modello comune consiste nel proiettare ogni gruppo in un oggetto riepilogativo usando Select dopo GroupBy.

Si legge la Key e si aggregano i membri, ad esempio calcolando un conteggio o una somma per ogni gruppo.

using System;
using System.Linq;
using System.Collections.Generic;

record Sale(string City, int Amt);
var sales = new List<Sale> { new("NY", 5), new("LA", 3), new("NY", 2) };
var totals = sales.GroupBy(s => s.City)
                  .Select(g => new { g.Key, Sum = g.Sum(x => x.Amt) });
foreach (var t in totals) Console.WriteLine($"{t.Key}={t.Sum}");

GroupBy con il selettore degli elementi

GroupBy dispone di un overload che accetta una seconda lambda, ovvero un selettore degli elementi, che definisce cosa memorizza ogni gruppo, non solo il modo in cui viene determinata la chiave.

Qui si raggruppa per città, memorizzando però solo gli importi.

using System;
using System.Linq;
using System.Collections.Generic;

record Sale(string City, int Amt);
var sales = new List<Sale> { new("NY", 5), new("NY", 2) };
var g = sales.GroupBy(s => s.City, s => s.Amt);
foreach (var grp in g)
  Console.WriteLine($"{grp.Key}: {string.Join(\",\", grp)}");

Ordinamento e raggruppamento sono differiti

Sia OrderBy sia GroupBy usano l'esecuzione differita: vengono eseguiti quando la sequenza viene enumerata. Tuttavia, tenga presente che l'ordinamento e il raggruppamento devono consumare l'intera origine prima di produrre il primo elemento.

Quindi, a differenza di Where, non sono operazioni in streaming: il costo viene sostenuto alla prima iterazione.

using System;
using System.Linq;

int[] nums = { 3, 1, 2 };
var q = nums.OrderBy(n => n);
Console.WriteLine("Query built");
Console.WriteLine(string.Join(", ", q));

Verifica rapida

Rifletta sull'ordinamento su più livelli.

Riepilogo

OrderBy/OrderByDescending ordinano in base a una chiave; ThenBy aggiunge criteri di spareggio. Un secondo OrderBy riordina gli elementi e non funge da criterio di spareggio.

GroupBy suddivide la sequenza in oggetti IGrouping con una Key e i relativi membri, spesso proiettati in riepiloghi. Entrambe le operazioni sono differite, ma consumano l'intera origine. Ora si passerà alle aggregazioni e alla materializzazione.

Domande Frequenti

La lezione «OrderBy e raggruppamento» è gratuita?

Sì — il testo completo di «OrderBy e raggruppamento» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C# Academy, passa a CoddyKit PRO. Il corso C# Academy include 4 lezioni in totale.

Cosa imparerò in «OrderBy e raggruppamento»?

Ordini e raggruppi i risultati Eserciti C# Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C# Academy?

Non è richiesta alcuna esperienza precedente. C# Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «OrderBy e raggruppamento»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C# Academy?

Sì. Ogni lezione C# Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Where e filtro
  2. Select e proiezione
  3. OrderBy e raggruppamento
  4. Aggregazioni e ToList
← Torna a C# Academy