Stringhe e Liste

Stringhe

Documentazione ufficiale

In C# string e' un tipo riferimento immutabile: ogni operazione che "modifica" una stringa crea in realta' un nuovo oggetto in memoria.

Dichiarazione e inizializzazione

string saluto = "Ciao, mondo!";
string vuota  = "";          // stringa vuota

Interpolazione e concatenazione

L'interpolazione (prefisso $) e' la forma preferita perche' piu' leggibile; la concatenazione con + e' ammessa ma crea oggetti temporanei ad ogni operazione.

string nome = "Alice";
int eta = 20;

// interpolazione
string messaggio = $"Mi chiamo {nome} e ho {eta} anni.";

// concatenazione
string messaggio2 = "Mi chiamo " + nome + " e ho " + eta + " anni.";

Proprieta' e funzioni principali

Funzione Descrizione
.Length numero di caratteri
.ToUpper() converte in maiuscolo
.ToLower() converte in minuscolo
.Trim() rimuove spazi iniziali e finali
.Contains(s) restituisce true se la sottostringa s e' presente
.StartsWith(s) restituisce true se inizia con s
.EndsWith(s) restituisce true se finisce con s
.Replace(old,new) sostituisce tutte le occorrenze di old con new
.Substring(i,n) estrae n caratteri a partire dall'indice i
.IndexOf(s) indice della prima occorrenza di s (-1 se assente)
.Split(sep) divide la stringa in un array usando sep
string.Join(sep,a) unisce gli elementi di a con il separatore sep

Le funzioni restituiscono la stringa modificata.

string frase = "  Ciao, Mondo!  ";
string tmp;
Console.WriteLine(frase.Trim());             // "Ciao, Mondo!"

tmp = frase.Trim().ToLower();
Console.WriteLine(tmp);   // "ciao, mondo!"

var lunghezza = frase.Trim().Length;
Console.WriteLine(lunghezza);      // 12
Console.WriteLine(frase.Contains("Mondo"));  // True

tmp = frase.Replace("Mondo", "C#");
Console.WriteLine(tmp); // "  Ciao, C#!  "

string parte = "abcdefgh";
tmp = parte.Substring(2, 4);    // "cdef"
Console.WriteLine(parte.IndexOf("de"));      // 3 (posizione a partire da posizione 0)

Split e Join

Split e Join permettono di convertire una stringa in array e viceversa.

string csv = "mela,pera,banana,kiwi";

// split: da stringa ad array
string[] frutti = csv.Split(',');
foreach (string f in frutti)
    Console.WriteLine(f);   // mela \n pera \n banana \n kiwi

// join: da array a stringa
string lista = string.Join(" - ", frutti);
Console.WriteLine(lista);   // mela - pera - banana - kiwi

StringBuilder

Quando e' necessario costruire una stringa con molte concatenazioni (ad esempio in un ciclo) si usa StringBuilder, che lavora su un buffer interno evitando la creazione di oggetti temporanei.

using System.Text;

StringBuilder sb = new StringBuilder();
for (int i = 1; i <= 5; i++)
{
    sb.Append($"riga {i}\n");
}
string risultato = sb.ToString();
Console.WriteLine(risultato);

Liste

Documentazione ufficiale

List<T> e' una collezione (un tipo di contenitore) generica a dimensione variabile. A differenza degli array, la sua dimensione puo' crescere o diminuire dinamicamente.

Dichiarazione e inizializzazione

Dobbiamo includere System.Collections.Generic per farne uso

using System.Collections.Generic;

// lista vuota di interi
List<int> numeri = new List<int>(); // List<int> e' il tipo, dobbiamo quindi
// usarlo ogni volta in cui andra' indicato il tipo

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

Aggiungere e rimuovere elementi

Metodo Descrizione
.Add(elemento) aggiunge in fondo
.Insert(i, elem) inserisce elem alla posizione i
.Remove(elem) rimuove la prima occorrenza di elem
.RemoveAt(i) rimuove l'elemento all'indice i
.Clear() svuota la lista
.Count numero di elementi presenti
List<string> spesa = new List<string>();

spesa.Add("latte");
spesa.Add("pane");
spesa.Add("uova");
spesa.Insert(1, "burro");   // inserisce "burro" all'indice 1

Console.WriteLine(spesa.Count);   // 4

spesa.Remove("pane");             // rimuove "pane"
spesa.RemoveAt(0);                // rimuove il primo elemento

foreach (string articolo in spesa)
    Console.WriteLine(articolo);  // burro / uova

Cercare elementi

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

Console.WriteLine(voti.Contains(9));   // True
Console.WriteLine(voti.IndexOf(6));    // 0  (prima occorrenza)
Console.WriteLine(voti.Count);         // 6

Ordinamento

List<int> valori = new List<int> { 5, 2, 8, 1, 9, 3 };
valori.Sort();   // ordine crescente

foreach (int v in valori)
    Console.Write($"{v} ");   // 1 2 3 5 8 9

valori.Reverse();             // inverte l'ordine
foreach (int v in valori)
    Console.Write($"{v} ");   // 9 8 5 3 2 1

Iterazione con foreach e indice

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

// foreach: consigliato quando non serve l'indice
foreach (string colore in colori)
    Console.WriteLine(colore);

// for con indice: utile quando serve la posizione
for (int i = 0; i < colori.Count; i++)
    Console.WriteLine($"[{i}] {colori[i]}");

Convertire tra array e lista

// array -> lista
string[] arrNomi = { "Anna", "Luca", "Sara" };
List<string> listaNomi = new List<string>(arrNomi);

// lista -> array
string[] arrCopia = listaNomi.ToArray();

Validate