0Pricing
C# Academy · Lezione

Aggregazioni e ToList

Conteggi, somme e materializzazione

Aggregazioni e ToList è una lezione C# Academy gratuita su CoddyKit. Questa è la lezione 4 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.

Conteggio degli elementi

Count restituisce il numero di elementi in una sequenza. Con un predicato, conta solo gli elementi che lo soddisfano.

Obbliga all'enumerazione, quindi percorre l'intera sequenza per produrre il totale: è un'operazione di aggregazione.

using System;
using System.Linq;

int[] nums = { 1, 2, 3, 4, 5 };
Console.WriteLine(nums.Count());
Console.WriteLine(nums.Count(n => n > 2));

Somma dei valori

Sum somma i valori numerici. Su una sequenza numerica somma gli elementi; con un selettore, somma un valore proiettato da ogni elemento.

Restituisce lo stesso tipo numerico dell'origine o del risultato del selettore.

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

record Order(int Qty, decimal Price);
var orders = new List<Order> { new(2, 5m), new(3, 4m) };
decimal total = orders.Sum(o => o.Qty * o.Price);
Console.WriteLine(total);

Calcolo della media

Average calcola la media aritmetica. Come Sum, accetta un selettore facoltativo.

Il risultato è un tipo a virgola mobile, ad esempio double, anche quando l'origine contiene interi, così la divisione non perde precisione.

using System;
using System.Linq;

int[] scores = { 80, 90, 100 };
double avg = scores.Average();
Console.WriteLine(avg);

Minimo e massimo

Min e Max restituiscono rispettivamente il valore più piccolo e quello più grande. Con un selettore, riducono una chiave proiettata.

Nel .NET moderno, MaxBy e MinBy restituiscono l'intero elemento con la chiave estrema, non solo il valore della chiave.

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

record P(string Name, int Age);
var ps = new List<P> { new("Ana", 30), new("Bo", 22) };
var oldest = ps.MaxBy(p => p.Age);
Console.WriteLine(oldest!.Name);

Problemi con le sequenze vuote

Su una sequenza vuota, Average, Min e Max applicati a tipi valore generano una InvalidOperationException. Sum restituisce zero e Count restituisce zero.

Usi Any() come controllo preliminare oppure applichi DefaultIfEmpty prima di calcolare la media di dati che potrebbero essere vuoti.

using System;
using System.Linq;

int[] empty = Array.Empty<int>();
double avg = empty.DefaultIfEmpty(0).Average();
Console.WriteLine(avg);

Aggregate per riduzioni personalizzate

Aggregate riduce una sequenza a un unico valore usando una funzione accumulatrice. È la forma generale alla base di Sum e di altri metodi.

È possibile fornire un valore iniziale e combinare ogni elemento con il risultato progressivo: è utile per prodotti, concatenazioni o logica personalizzata.

using System;
using System.Linq;

int[] nums = { 1, 2, 3, 4 };
int product = nums.Aggregate(1, (acc, n) => acc * n);
Console.WriteLine(product);

Materializzazione con ToList

ToList esegue immediatamente la query e copia i risultati in una List<T>. In questo modo interrompe intenzionalmente l'esecuzione differita.

Lo usi per acquisire uno snapshot stabile, evitare di rieseguire una pipeline costosa o ottenere funzionalità delle liste come l'indicizzazione e la proprietà Count.

using System;
using System.Linq;

int[] nums = { 1, 2, 3, 4 };
var evens = nums.Where(n => n % 2 == 0).ToList();
evens.Add(6);
Console.WriteLine(string.Join(", ", evens));

ToArray e ToDictionary

Tra gli altri metodi di materializzazione ci sono ToArray, che crea un array di dimensione fissa, e ToDictionary, che consente la ricerca basata su una chiave.

ToDictionary accetta un selettore della chiave e, facoltativamente, un selettore del valore; genera un'eccezione se due elementi producono la stessa chiave.

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

record P(string Name, int Age);
var ps = new List<P> { new("Ana", 30), new("Bo", 22) };
var byName = ps.ToDictionary(p => p.Name, p => p.Age);
Console.WriteLine(byName["Ana"]);

Perché materializzare

Le query differite vengono rieseguite ogni volta che vengono iterate. Se una pipeline è costosa o legge un'origine soggetta a modifiche, questa ripetizione può causare bug e rallentamenti.

Chiamando ToList una sola volta si acquisiscono i risultati, così le letture successive sono rapide e coerenti.

using System;
using System.Linq;

int runs = 0;
int[] nums = { 1, 2, 3 };
var list = nums.Select(n => { runs++; return n; }).ToList();
foreach (var _ in list) { }
foreach (var _ in list) { }
Console.WriteLine(runs);

First, Single e Any

Anche gli operatori sugli elementi obbligano all'esecuzione. First restituisce la prima corrispondenza e genera un'eccezione se non ne trova alcuna, FirstOrDefault restituisce invece il valore predefinito e Single richiede che ve ne sia esattamente una.

Any indica se una sequenza contiene almeno un elemento corrispondente, senza contarli tutti.

using System;
using System.Linq;

int[] nums = { 3, 8, 5, 12 };
int firstBig = nums.First(n => n > 7);
bool hasOdd = nums.Any(n => n % 2 == 1);
Console.WriteLine($"{firstBig} {hasOdd}");

Pipeline completa

Le query reali concatenano filtraggio, proiezione, ordinamento e aggregazione, spesso terminando con un metodo di materializzazione.

La si legga dall'alto verso il basso: prima si filtra, poi si definisce la forma, quindi si ordina e infine si raccolgono i risultati. Il metodo finale ToList esegue l'intera pipeline una sola volta.

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", 9) };
var top = sales.Where(s => s.Amt > 4)
               .OrderByDescending(s => s.Amt)
               .Select(s => s.City)
               .ToList();
Console.WriteLine(string.Join(", ", top));

Verifica rapida

Rifletta sull'esecuzione differita e sulla materializzazione.

Riepilogo

Le aggregazioni riducono una sequenza a un valore: Count, Sum, Average, Min/Max, MinBy/MaxBy e il metodo generale Aggregate. Obbligano all'esecuzione e possono generare eccezioni su origini vuote.

ToList, ToArray e ToDictionary materializzano i risultati, interrompendo il differimento affinché una pipeline costosa venga eseguita una sola volta. Questo completa gli strumenti LINQ per il filtraggio e la proiezione.

Domande Frequenti

La lezione «Aggregazioni e ToList» è gratuita?

Sì — il testo completo di «Aggregazioni e ToList» è 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 «Aggregazioni e ToList»?

Conteggi, somme e materializzazione 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 4 di 4.

Quanto tempo richiede la lezione «Aggregazioni e ToList»?

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