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.
