C# fornisce degli strumenti per poter accedere velocemente agli elementi di una sequenza utilizzando una sintassi concisa e intuitiva.
Questo supporto linguistico è stato introdotto a partire dalla versione C# 8 e si basa su due nuovi tipi e due nuovi operatori. Vediamo di che si tratta.
I tipi sono i seguenti :
- System.Index rappresenta un indice in una sequenza.
- System.Range rappresenta un sottointervallo di una sequenza.
Gli operatori collegati a questi nuovi tipi invece sono :
- L’ operatore indice da fine
^ // Operatore Indice dalla Fine // Specifica che un indice è relativo alla fine di una sequenza.
- L’ operatore di intervallo o range
.. // Operatore Range // Specifica l'inizio e la fine di un intervallo come suoi operandi
Gli indici
Consideriamo un array arrayGenerico[].
L’ indice 0 all’interno dell’array indica l’elemento 0 dell’array cioè arrayGenerico[0].
L’indice ^n all’interno dello stesso array invece rappresenta l’elemento arrayGenerico[arrayGenerico.Length-n] cioè l’n-esimo elemento a partire dalla fine.
E’ facile intuire che l’espressione arrayGenerico[0^] genererà un’accezione in quanto rappresenta l’elemento arrayGenerico[arrayGenerico.Length] che non è valido negli array in c#.
Volendo estendere l’esempio consideriamo un elenco di parole e vediamo come recuperare l’ultima :
private string[] parole = [ // index dall'inizio index dalla fine "prima", // 0 ^10 "seconda", // 1 ^9 "terza", // 2 ^8 "quarta", // 3 ^7 "quinta", // 4 ^6 "sesta", // 5 ^5 "settima", // 6 ^4 "ottava", // 7 ^3 "nona", // 8 ^2 "decima" // 9 ^1 ]; // 10 ( parole .Length) ^0 Console.WriteLine($"L'ultima parola è < {parole [^1]} >.");
I Range
Un range specifica l’ inizio e la fine di un intervallo.
Il funzionamento è semplicissimo ma bisogna fare attenzione ad una singola cosa : l’inizio dell’intervallo è inclusivo, mentre la fine dell’intervallo è esclusiva, il che significa che l’ inizio è incluso nell’intervallo ma la fine non è inclusa nell’intervallo.
Quindi tornando all’esempio precedente il range [0..^0] rappresenta l’intero intervallo, proprio come [0..arrayGenerico.Length] rappresenta l’intero intervallo.
Il codice seguente crea un sottointervallo con le parole “seconda”, “terza” e “quarta”.
Include parole[1] fino a parole[3].
L’elemento parole[4]non è nell’intervallo.
private string[] parole = [ // index dall'inizio index dalla fine "prima", // 0 ^10 "seconda", // 1 ^9 "terza", // 2 ^8 "quarta", // 3 ^7 "quinta", // 4 ^6 "sesta", // 5 ^5 "settima", // 6 ^4 "ottava", // 7 ^3 "nona", // 8 ^2 "decima" // 9 ^1 ]; // 10 ( parole .Length) ^0 string[] secondaTerzaQuarta = parole[1..4]; // contiene "seconda", "terza" e "quarta" // foreach (var parola in secondaTerzaQuarta ) Console.Write($"{parola }"); Console.WriteLine();
Gli esempi seguenti creano intervalli aperti per l’inizio, la fine o entrambi:
string[] allWords = parole[..]; // contiene tutte le parole da "prima" a "decima". string[] firstPhrase = parole[..4]; // contiene tutte le parole da "prima" a "quarta" string[] lastPhrase = parole[6..]; // contiene tutte le parole da "sesta" a "decima" foreach (var word in allWords) Console.Write($"< {word} >"); Console.WriteLine(); foreach (var word in firstPhrase) Console.Write($"< {word} >"); Console.WriteLine(); foreach (var word in lastPhrase) Console.Write($"< {word} >"); Console.WriteLine();
Riferimenti Utili
- C# 12 & .NET 8, Guida completa per sviluppatori e principianti: Programmazione ad oggetti, machine learning, creazione di siti e applicazioni, con oltre 200 esercizi risolti
- C#: Algoritmi e Programmi
- Esplorando ChatGPT: Un’introduzione alla conversazione con l’intelligenza artificiale
Sono laureato in Ingegneria Informatica presso l’Univertità degli Studi di Lecce (2008).
Attualmente mi occupo di Sviluppo C#.Net / Mono in ambiente Linux
Sviluppo da anni applicativi ANSI C per terminali POS basati su processori ARM Risc 32Bit con 2-4 MB di Ram.