Utilizzo indici e range in [c#] per accedere agli elementi in una sequenza

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

 

 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *