Menu
Coddy logo textTech

Indicizzatori (this[])

Fa parte della sezione Programmazione orientata agli oggetti del percorso C# di Coddy. Lezione 37 di 70.

Gli indicizzatori ti permettono di accedere agli elementi della tua classe usando la notazione tra parentesi quadre, simile a quella degli array. Invece di chiamare un metodo come collection.GetItem(0), puoi scrivere la forma più intuitiva collection[0].

Definisci un indicizzatore usando la parola chiave this con le parentesi quadre:

public class Sentence
{
    private string[] words;
    
    public Sentence(string text)
    {
        words = text.Split(' ');
    }
    
    public string this[int index]
    {
        get { return words[index]; }
        set { words[index] = value; }
    }
}

Ora puoi accedere alle parole in modo naturale:

Sentence s = new Sentence("Hello World");
Console.WriteLine(s[0]);  // Hello
s[1] = "C#";
Console.WriteLine(s[1]);  // C#

Gli indicizzatori non sono limitati agli interi. Puoi usare qualsiasi tipo come parametro di indice, rendendoli utili per un accesso simile a quello dei dizionari:

public string this[string key]
{
    get { return dictionary[key]; }
    set { dictionary[key] = value; }
}

Come le proprietà, gli indicizzatori possono essere di sola lettura (omettendo il setter) o includere logica di convalida nei relativi accessori. Sono ideali quando la tua classe avvolge una raccolta o quando la notazione con parentesi quadre rende il codice più leggibile.

challenge icon

Sfida

Facile

Creiamo una classe Playlist che ti consenta di accedere ai brani usando un’intuitiva notazione con parentesi quadre, proprio come quando lavori con un array. Creerai una playlist musicale in cui i brani possono essere recuperati e aggiornati in base alla loro posizione usando un indicizzatore.

Organizzerai il codice in due file:

  • Playlist.cs: crea una classe Playlist nello spazio dei nomi Music che racchiuda una raccolta interna di brani e fornisca un accesso simile a quello di un array tramite un indicizzatore. La playlist dovrebbe avere:
    • Un array di stringhe privato per memorizzare i titoli dei brani
    • Un costruttore che accetti una stringa di titoli dei brani separati da virgole e la divida nell’array interno
    • Un indicizzatore che usa this[int index] e consente sia di ottenere sia di impostare i brani in una posizione specifica
    • Una proprietà di sola lettura Count che restituisce il numero di brani nella playlist
    • Un metodo GetAllSongs() che restituisce tutti i brani uniti da " | "
  • Program.cs: nel file principale, crea una playlist a partire dall’input, poi usa l’indicizzatore per accedere ai brani e modificarli. Mostra sia come leggere i brani tramite indice sia come aggiornare un brano in una posizione specifica.

Riceverai tre input:

  • Un elenco di titoli di brani separati da virgole (ad es. Song A,Song B,Song C)
  • Un indice da recuperare (intero)
  • Un nuovo titolo di brano che sostituirà il brano allo stesso indice

Stampa l’output in questo formato:

Total songs: {Count}
Song at index {index}: {song title}
After update: {GetAllSongs()}

Per esempio, se gli input sono Rock Anthem,Jazz Vibes,Pop Hit, 1 e Blues Classic, l’output dovrebbe essere:

Total songs: 3
Song at index 1: Jazz Vibes
After update: Rock Anthem | Blues Classic | Pop Hit

Nota come l’indicizzatore ti consente di accedere a playlist[1] per ottenere "Jazz Vibes" e poi assegnare playlist[1] = "Blues Classic" per aggiornarlo: è molto più naturale che chiamare metodi come GetSongAt(1) o SetSongAt(1, "Blues Classic")!

Provalo tu

using System;
using Music;

class Program
{
    public static void Main(string[] args)
    {
        // Leggi i dati di input
        string songList = Console.ReadLine();
        int index = Convert.ToInt32(Console.ReadLine());
        string newSong = Console.ReadLine();

        // TODO: Crea un oggetto Playlist a partire da songList

        // TODO: Stampa il numero totale di brani usando la proprietà Count

        // TODO: Stampa il brano all'indice specificato usando l'indicizzatore

        // TODO: Aggiorna il brano all'indice specificato usando l'indicizzatore

        // TODO: Stampa tutti i brani dopo l'aggiornamento usando GetAllSongs()
    }
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore C# online