Liste

Strutura dati dinamica Lista

ITT Fauser — Classi quarte

📋

Liste

Collezioni dinamiche con List<T>

Array vs Lista: qual è la differenza?

Array int[]Lista List<int>
DimensioneFissa, stabilita alla creazioneVariabile, cresce e si riduce
Aggiungere elementiNon possibile.Add()
Rimuovere elementiNon possibile.Remove()
Accesso per indicearr[i]lista[i]
Numero elementi.Length.Count
NamespaceSystem.Collections.Generic
Regola pratica: se sai già quanti elementi avrai e non cambieranno, usa un array. Se la dimensione può variare, usa una List<T>.

Dichiarazione e inizializzazione

Il tipo T in List<T> indica il tipo degli elementi contenuti nella lista.

using System.Collections.Generic;

// Lista vuota di interi
List<int> numeri = new List<int>();

// Lista inizializzata con valori
List<string> nomi = new List<string> { "Alice", "Bob", "Carlo" };

// Lista di double
List<double> prezzi = new List<double> { 1.99, 3.50, 0.89 };
List<int> è sia il tipo che va scritto sia a sinistra che a destra dell'assegnazione. Non è possibile mescolare tipi diversi: una List<int> contiene solo interi.

Aggiungere e rimuovere elementi

MetodoDescrizione
.Add(elem)Aggiunge in fondo
.Insert(i, elem)Inserisce in posizione i
.Remove(elem)Rimuove la prima occorrenza
.RemoveAt(i)Rimuove l'elemento in posizione i
.Clear()Svuota la lista
.CountNumero di elementi presenti
List<string> spesa =
    new List<string>();

spesa.Add("latte");
spesa.Add("pane");
spesa.Add("uova");
spesa.Insert(1, "burro");
// ["latte","burro","pane","uova"]

spesa.Remove("pane");
spesa.RemoveAt(0);

Console.WriteLine(spesa.Count); // 2
// ["burro","uova"]

Cercare e ordinare

Ricerca

List<int> voti =
    new List<int> { 6, 8, 7, 9, 6 };

voti.Contains(9);  // True
voti.IndexOf(6);   // 0
voti.Count;        // 5

Ordinamento

List<int> val =
    new List<int> { 5, 2, 8, 1 };

val.Sort();
// [1, 2, 5, 8]

val.Reverse();
// [8, 5, 2, 1]
.Sort() modifica la lista originale (ordinamento in-place). Per le stringhe ordina in ordine alfabetico; per i numeri in ordine crescente.

Scorrere una lista

foreach consigliato

Quando non serve la posizione dell'elemento.

List<string> colori =
  new List<string>
  { "rosso", "verde", "blu" };

foreach (string c in colori)
    Console.WriteLine(c);

for con indice

Quando serve anche la posizione. Notare .Count al posto di .Length.

for (int i = 0; i < colori.Count; i++)
{
    Console.WriteLine(
        $"[{i}] {colori[i]}");
}
// [0] rosso
// [1] verde
// [2] blu

Convertire tra array e lista

È possibile passare facilmente da un formato all'altro: utile quando si lavora con metodi che richiedono un tipo specifico.

// Array → Lista
string[] arrNomi = { "Anna", "Luca", "Sara" };
List<string> listaNomi = new List<string>(arrNomi);

// Lista → Array
string[] arrCopia = listaNomi.ToArray();
string[]
array
→ new List<string>(arr) →
List<string>
→ .ToArray() →
string[]
nuovo array
Split() restituisce sempre un array; se occorre aggiungere o rimuovere elementi in seguito, converti subito in lista.

Esempio completo: gestione voti

using System;
using System.Collections.Generic;

List<int> voti = new List<int>();
string input;

do
{
    Console.Write("Inserisci voto (o 'fine'): ");
    input = Console.ReadLine().Trim();

    if (input != "fine")
        voti.Add(int.Parse(input));
} while (input != "fine");

voti.Sort();
double somma = 0;
foreach (int v in voti) somma += v;

Console.WriteLine($"Voti ordinati: {string.Join(", ", voti)}");
Console.WriteLine($"Media: {somma / voti.Count:F2}");

Riepilogo

Stringhe

  • Tipo riferimento, immutabile
  • Interpolazione con $"..."
  • Metodi: Trim, ToUpper/Lower, Contains, Replace, Substring, IndexOf
  • Split / Join per conversioni array ↔ stringa
  • StringBuilder per concatenazioni in loop

Liste

  • List<T>: collezione a dimensione variabile
  • Add, Insert, Remove, RemoveAt, Clear
  • Contains, IndexOf, Sort, Reverse
  • Iterazione con foreach o for
  • Conversione da/verso array con ToArray()