Menu
Coddy logo textTech

Indexadores (this[])

Parte de la sección Programación Orientada a Objetos del Journey de C# de Coddy — lección 37 de 70.

Los indizadores le permiten acceder a los elementos de su clase utilizando una notación de corchetes similar a la de los arreglos. En lugar de llamar a un método como collection.GetItem(0), puede escribir el más intuitivo collection[0].

Se define un indizador utilizando la palabra clave this con corchetes:

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; }
    }
}

Ahora puedes acceder a las palabras de forma natural:

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

Los indizadores no están limitados a enteros. Puede usar cualquier tipo como parámetro de índice, lo que los hace útiles para el acceso de tipo diccionario:

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

Al igual que las propiedades, los indizadores pueden ser de solo lectura (omitiendo el setter) o incluir lógica de validación en sus descriptores de acceso. Son ideales cuando su clase envuelve una colección o cuando la notación de corchetes hace que el código sea más legible.

challenge icon

Desafío

Fácil

Vamos a construir una clase Playlist que te permita acceder a las canciones utilizando una notación de corchetes intuitiva, tal como si trabajaras con un array. Crearás una lista de reproducción de música donde las canciones se pueden recuperar y actualizar por su posición utilizando un indexador.

Organizarás tu código en dos archivos:

  • Playlist.cs: Crea una clase Playlist en el espacio de nombres Music que envuelva una colección interna de canciones y proporcione acceso tipo array a través de un indexador. Tu lista de reproducción debe tener:
    • Un array de cadenas privado para almacenar los títulos de las canciones
    • Un constructor que acepte una cadena de títulos de canciones separados por comas y la divida en el array interno
    • Un indexador usando this[int index] que permita tanto obtener como establecer canciones en una posición específica
    • Una propiedad de solo lectura Count que devuelva el número de canciones en la lista de reproducción
    • Un método GetAllSongs() que devuelva todas las canciones unidas por " | "
  • Program.cs: En tu archivo principal, crea una lista de reproducción a partir de la entrada, luego usa el indexador para acceder y modificar canciones. Demuestra tanto la lectura de canciones por índice como la actualización de una canción en una posición específica.

Recibirás tres entradas:

  • Una lista de títulos de canciones separados por comas (por ejemplo, Song A,Song B,Song C)
  • Un índice para recuperar (entero)
  • Un nuevo título de canción para reemplazar la canción en ese mismo índice

Imprime la salida en este formato:

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

Por ejemplo, si las entradas son Rock Anthem,Jazz Vibes,Pop Hit, 1, y Blues Classic, la salida debería ser:

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

Observa cómo el indexador te permite acceder a playlist[1] para obtener "Jazz Vibes" y luego asignar playlist[1] = "Blues Classic" para actualizarlo, ¡mucho más natural que llamar a métodos como GetSongAt(1) o SetSongAt(1, "Blues Classic")!

Hoja de referencia

Los indizadores le permiten acceder a los elementos de su clase utilizando la notación de corchetes similar a la de un array (collection[0]) en lugar de llamadas a métodos.

Defina un indizador utilizando la palabra clave this con corchetes:

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; }
    }
}

Ejemplo de uso:

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

Los indizadores pueden utilizar cualquier tipo como parámetro de índice, no solo enteros:

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

Al igual que las propiedades, los indizadores pueden ser de solo lectura (omitiendo el setter) o incluir lógica de validación en sus descriptores de acceso.

Pruébalo tú mismo

using System;
using Music;

class Program
{
    public static void Main(string[] args)
    {
        // Leer entradas
        string songList = Console.ReadLine();
        int index = Convert.ToInt32(Console.ReadLine());
        string newSong = Console.ReadLine();

        // TODO: Crear un objeto Playlist a partir de songList

        // TODO: Imprimir el número total de canciones usando la propiedad Count

        // TODO: Imprimir la canción en el índice dado usando el indexador

        // TODO: Actualizar la canción en el índice dado usando el indexador

        // TODO: Imprimir todas las canciones después de la actualización usando GetAllSongs()
    }
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos