0Pricing
C# Academy · Lezione

Le liste nella pratica

Aggiunga, rimuova e cerchi elementi.

Le liste nella pratica è 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.

Perché List<T>?

List<T> è l'array dinamico di uso quotidiano in C#. Risiede in System.Collections.Generic e cresce automaticamente quando si aggiungono elementi.

A differenza di un semplice array, non è mai necessario impostare in anticipo una dimensione fissa. È tipizzata in modo sicuro: una List<int> contiene solo valori int, rilevati in fase di compilazione.

using System.Collections.Generic;

List<int> scores = new List<int>();
scores.Add(90);
scores.Add(85);

Creazione e inizializzazione

È possibile riempire subito una lista usando un inizializzatore di raccolta. È una sintassi concisa e leggibile.

Dietro le quinte, il compilatore trasforma ogni voce in una chiamata a Add, quindi il risultato è identico all'aggiunta degli elementi uno alla volta.

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var fruits = new List<string> { "apple", "pear", "plum" };
        Console.WriteLine(fruits.Count);
    }
}

Indici e Count

È possibile accedere agli elementi tramite un indice a base zero, proprio come in un array. list[0] è il primo elemento.

Usi Count, non Length, per sapere quanti elementi contiene la lista. La lettura o la scrittura tramite indice richiede tempo costante O(1).

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var nums = new List<int> { 10, 20, 30 };
        Console.WriteLine(nums[1]);
        Console.WriteLine(nums.Count);
    }
}

Aggiunta e inserimento

Add aggiunge elementi in coda con un costo ammortizzato O(1). AddRange aggiunge molti elementi in una sola volta.

Insert(index, item) inserisce un elemento in una posizione, spostando tutto ciò che segue. Questo spostamento rende l'inserimento in testa con Insert un'operazione O(n), quindi, quando possibile, è preferibile aggiungere in coda.

var list = new List<string> { "b", "c" };
list.Insert(0, "a");
list.AddRange(new[] { "d", "e" });
// list is now a, b, c, d, e

Rimozione degli elementi

Remove(item) elimina il primo valore corrispondente e restituisce true se lo trova. RemoveAt(index) elimina un elemento in base alla posizione.

Entrambi spostano a sinistra gli elementi successivi, quindi la rimozione dal centro ha costo O(n). RemoveAll accetta un predicato e rimuove tutte le corrispondenze in un'unica passata.

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var nums = new List<int> { 1, 2, 3, 4, 5 };
        nums.RemoveAll(n => n % 2 == 0);
        Console.WriteLine(string.Join(",", nums));
    }
}

Ricerca in una lista

Contains indica se un valore esiste; IndexOf ne restituisce la posizione oppure -1. Entrambi eseguono una scansione lineare, O(n).

Se si cerca ripetutamente un valore in una lista di grandi dimensioni, questo costo lineare si somma rapidamente. Un HashSet o un Dictionary potrebbe essere più adatto.

var names = new List<string> { "Ann", "Bob", "Cy" };
bool hasBob = names.Contains("Bob");   // true
int pos = names.IndexOf("Cy");          // 2

Iterazione

Un ciclo foreach è il modo più chiaro per leggere ogni elemento. È anche possibile usare un ciclo for classico quando serve l'indice.

Non aggiunga né rimuova elementi all'interno di un foreach sulla stessa lista: viene generata un'eccezione InvalidOperationException.

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var colors = new List<string> { "red", "green", "blue" };
        foreach (var c in colors)
            Console.WriteLine(c);
    }
}

Ordinamento

Sort() ordina la lista sul posto usando il comparatore predefinito. Per un ordinamento personalizzato, passi un delegato di confronto.

L'ordinamento ha costo O(n log n). Per ottenere una copia ordinata senza modificare l'originale, usi OrderBy di LINQ, che restituisce una nuova sequenza.

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var nums = new List<int> { 4, 1, 3, 2 };
        nums.Sort();
        Console.WriteLine(string.Join(",", nums));
    }
}

Capacity e Count

Count indica quanti elementi esistono; Capacity indica quanti elementi la lista può contenere prima di riallocare l'array interno.

Quando la lista supera la capacità, alloca un array più grande e copia gli elementi, aumentandone approssimativamente il numero fino al doppio. Se conosce la dimensione finale, la passi al costruttore per evitare copie ripetute.

var list = new List<int>(1000); // reserve capacity
for (int i = 0; i < 1000; i++)
    list.Add(i);
// no intermediate reallocations

List come argomento di un metodo

Una List<T> è un tipo riferimento. Passarla a un metodo significa passare il riferimento, quindi le modifiche apportate all'interno del metodo influiscono sulla lista del chiamante.

Se un metodo deve solo leggere, accetti IEnumerable<T> o IReadOnlyList<T> per indicare che non la modificherà.

using System;
using System.Collections.Generic;

class Program {
    static void AddOne(List<int> xs) => xs.Add(1);
    static void Main() {
        var nums = new List<int>();
        AddOne(nums);
        Console.WriteLine(nums.Count); // 1
    }
}

Conversione e copia

ToArray() produce un array di dimensione fissa; new List<T>(other) crea una copia superficiale di un'altra sequenza.

Una copia superficiale duplica la struttura della lista, ma condivide gli stessi riferimenti agli elementi, quindi la modifica di un oggetto contenuto è visibile attraverso entrambe le liste.

var original = new List<int> { 1, 2, 3 };
int[] arr = original.ToArray();
var copy = new List<int>(original);

Verifica rapida

Individui l'operazione con il costo più elevato.

Riepilogo

List<T> è un array estensibile e tipizzato in modo sicuro. L'accesso tramite indice e Count hanno costo O(1); Add in coda ha costo ammortizzato O(1).

L'inserimento, la rimozione e la ricerca per valore nel mezzo hanno costo O(n) a causa dello spostamento o della scansione. Riservi in anticipo la capacità quando la dimensione è nota, per evitare riallocazioni.

Domande Frequenti

La lezione «Le liste nella pratica» è gratuita?

Sì — il testo completo di «Le liste nella pratica» è 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 «Le liste nella pratica»?

Aggiunga, rimuova e cerchi elementi. 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 «Le liste nella pratica»?

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. Le liste nella pratica
  2. Ricerche nei dizionari
  3. HashSet e unicità
  4. Scegliere una collezione
← Torna a C# Academy