0Pricing
C# Academy · Lezione

Where e filtro

Selezioni gli elementi corrispondenti

Where e filtro è una lezione C# Academy gratuita su CoddyKit. Questa è la lezione 1 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.

Cosa fa Where

Where è l'operatore di filtraggio fondamentale di LINQ. Accetta un predicato — una funzione che restituisce bool — e produce solo gli elementi che lo soddisfano.

Si trova in System.Linq e funziona con qualsiasi IEnumerable<T>, restituendo una nuova sequenza invece di modificare la sorgente.

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

var nums = new List<int> { 1, 2, 3, 4, 5, 6 };
var evens = nums.Where(n => n % 2 == 0);
Console.WriteLine(string.Join(", ", evens));

La lambda del predicato

L'argomento di Where è una lambda n => condition. Il parametro rappresenta ogni elemento e il corpo deve restituire true o false.

Restituire true mantiene l'elemento; false lo esclude. È possibile usare qualsiasi espressione booleana.

using System;
using System.Linq;

string[] words = { "apple", "fig", "banana", "kiwi" };
var shortWords = words.Where(w => w.Length <= 4);
Console.WriteLine(string.Join(", ", shortWords));

Forma con sintassi di query

LINQ offre una sintassi di query che ricorda SQL. Una clausola where filtra, mentre select esegue la proiezione.

Viene compilata nelle stesse chiamate di metodo, quindi from x in src where ... select x è identico a src.Where(...). Utilizzi la forma più leggibile.

using System;
using System.Linq;

int[] scores = { 40, 75, 90, 55, 88 };
var passing = from s in scores
              where s >= 60
              select s;
Console.WriteLine(string.Join(", ", passing));

Combinare le condizioni

All'interno di un singolo predicato può combinare più controlli con && e ||. In questo modo il filtraggio correlato viene eseguito in un'unica passata.

Le parentesi migliorano la leggibilità quando si combinano operatori, proprio come in qualsiasi espressione booleana.

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

var ages = new List<int> { 12, 17, 21, 35, 64, 70 };
var adults = ages.Where(a => a >= 18 && a < 65);
Console.WriteLine(string.Join(", ", adults));

concatenare le chiamate a Where

Può concatenare più chiamate a Where. Ciascuna filtra il risultato della precedente, quindi le condizioni vengono combinate con un AND logico.

La concatenazione è talvolta più chiara di un unico predicato molto grande e consente di comporre filtri creati in punti diversi.

using System;
using System.Linq;

int[] data = { 3, 8, 15, 22, 27, 40 };
var result = data.Where(n => n > 5)
                 .Where(n => n % 2 == 0);
Console.WriteLine(string.Join(", ", result));

Where con indice

Un overload di Where espone l'indice a base zero dell'elemento come secondo parametro della lambda. È utile per applicare filtri basati sulla posizione.

Può usarlo, ad esempio, per conservare un elemento ogni due oppure per saltare il primo elemento in base all'indice.

using System;
using System.Linq;

string[] items = { "a", "b", "c", "d", "e" };
var evenIdx = items.Where((val, idx) => idx % 2 == 0);
Console.WriteLine(string.Join(", ", evenIdx));

Filtrare gli oggetti

Il filtraggio è particolarmente utile sulle raccolte di oggetti. Il predicato può leggere qualsiasi proprietà di ogni elemento.

È così che si esprimono in modo dichiarativo le regole di business: «clienti di questa città», «ordini oltre una determinata soglia».

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

record Product(string Name, decimal Price);
var list = new List<Product> {
  new("Pen", 1.5m), new("Lamp", 20m), new("Mug", 8m) };
var cheap = list.Where(p => p.Price < 10);
foreach (var p in cheap) Console.WriteLine(p.Name);

Esecuzione differita

Where usa l'esecuzione differita: non viene eseguito quando viene definito, ma solo quando la sequenza viene iterata, ad esempio in un foreach o chiamando ToList.

Ciò significa che le modifiche apportate alla sorgente prima dell'iterazione vengono riflesse nel risultato.

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

var src = new List<int> { 1, 2 };
var q = src.Where(n => n > 1);
src.Add(5);
Console.WriteLine(string.Join(", ", q));

Costo della rivalutazione

Poiché il filtraggio è differito, iterare due volte la stessa query esegue nuovamente il predicato entrambe le volte. Questo può essere sorprendente con predicati costosi o sorgenti dinamiche.

Quando serve uno snapshot stabile e riutilizzabile, materializzi una sola volta con ToList: ne parleremo più avanti nel corso.

using System;
using System.Linq;

int calls = 0;
int[] nums = { 1, 2, 3 };
var q = nums.Where(n => { calls++; return n > 1; });
foreach (var _ in q) { }
foreach (var _ in q) { }
Console.WriteLine(calls);

Filtrare e poi contare

Un modello comune consiste nel filtrare e poi contare gli elementi corrispondenti. Count può accettare direttamente un predicato, combinando filtraggio e conteggio.

count.Count(p => cond) equivale a seq.Where(p => cond).Count(), ma è più conciso.

using System;
using System.Linq;

int[] grades = { 55, 80, 42, 91, 67 };
int passed = grades.Count(g => g >= 60);
Console.WriteLine($"Passed: {passed}");

I risultati vuoti vanno bene

Se nessun elemento soddisfa il predicato, Where produce semplicemente una sequenza vuota, mai null.

Questo rende sicuro concatenare i filtri: un risultato vuoto passa attraverso gli operatori successivi senza richiedere una gestione speciale.

using System;
using System.Linq;

int[] nums = { 1, 2, 3 };
var big = nums.Where(n => n > 100);
Console.WriteLine($"Count: {big.Count()}");

Verifica rapida

Metta alla prova la Sua comprensione dell'esecuzione differita.

Riepilogo

Where filtra una sequenza tramite un predicato booleano e restituisce un nuovo IEnumerable. Dispone di un overload con indice, può essere concatenato o combinato con &&/|| e funziona sugli oggetti tramite le loro proprietà.

È fondamentale ricordare che è differito: viene eseguito durante l'iterazione, quindi una nuova iterazione comporta una nuova valutazione. Ora vedremo come definire ciò che conservare con Select.

Domande Frequenti

La lezione «Where e filtro» è gratuita?

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

Selezioni gli elementi corrispondenti 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 1 di 4.

Quanto tempo richiede la lezione «Where e filtro»?

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