Indexación en C#

En C#, la indexación te permite acceder a los elementos de una clase de forma similar a como se hace con una matriz. Esta poderosa herramienta te ofrece una mayor flexibilidad y control sobre cómo se estructura y se interactúa con tus datos.

¿Qué es un indexador?

Un indexador es una propiedad especial que se define en una clase y que permite acceder a sus miembros de forma indizada.

En otras palabras, puedes usar un índice para obtener o establecer el valor de un elemento específico dentro de la clase.

¿Cómo funciona un indexador?

Un indexador se define utilizando la palabra clave this seguida de un parámetro entre corchetes. El tipo de dato del parámetro determina el tipo de índice que se puede usar para acceder a la propiedad.

Por ejemplo, un indexador que toma un índice entero te permite acceder a los elementos de una matriz interna.

Ejemplo:


public class Persona
{
    private string[] _nombres;

    public Persona(string nombre1, string nombre2)
    {
        _nombres = new string[] { nombre1, nombre2 };
    }

    public string this[int indice]
    {
        get { return _nombres[indice]; }
        set { _nombres[indice] = value; }
    }
}

Lenguaje del código: C# (cs)

En este ejemplo, la clase Persona tiene un indexador que toma un índice entero. Esto permite acceder a los nombres de la persona utilizando la sintaxis persona[indice].

Ventajas de usar indexadores:

  • Flexibilidad: Los indexadores te permiten acceder a los datos de forma más flexible que con las propiedades tradicionales.
  • Encapsulamiento: Los indexadores te permiten ocultar la implementación interna de la clase y proporcionar una interfaz más sencilla para acceder a los datos.
  • Código más legible: El uso de indexadores puede hacer que tu código sea más legible y fácil de entender.

Ejemplos de uso de indexadores:

  • Implementar una lista personalizada.
  • Acceder a los elementos de una matriz multidimensional.
  • Simular el comportamiento de un diccionario.

Por supuesto, aquí tienes ejemplos de cómo implementar indexadores en C# para cada uno de los casos que mencionaste:

1) Implementación de una Lista Personalizada:

Vamos a crear una lista personalizada en C# utilizando indexadores. Esta lista permitirá agregar, eliminar y acceder a elementos como lo harías con una lista estándar de C#.

Aquí tienes un ejemplo de cómo implementar esto:


using System;

public class MiLista<T>
{
    private T[] elementos = new T[10];

    public T this[int index]
    {
        get { return elementos[index]; }
        set { elementos[index] = value; }
    }

    public int Count => elementos.Length;
}

class Program
{
    static void Main(string[] args)
    {
        MiLista<int> lista = new MiLista<int>();
        lista[0] = 10;
        lista[1] = 20;
        lista[2] = 30;

        Console.WriteLine("Elementos de la lista:");
        for (int i = 0; i < lista.Count; i++)
        {
            Console.WriteLine(lista[i]);
        }
    }
}

Lenguaje del código: C# (cs)

2) Acceso a los Elementos de una Matriz Multidimensional:

Vamos a crear una clase que represente una matriz bidimensional y permita acceder a sus elementos utilizando indexadores en C#.

Aquí tienes un ejemplo:


using System;

public class Matriz
{
    private int[,] datos = new int[3, 3];

    public int this[int fila, int columna]
    {
        get { return datos[fila, columna]; }
        set { datos[fila, columna] = value; }
    }
}

class Program
{
    static void Main(string[] args)
    {
        Matriz matriz = new Matriz();
        matriz[0, 0] = 1;
        matriz[0, 1] = 2;
        matriz[1, 0] = 3;
        matriz[1, 1] = 4;

        Console.WriteLine("Elementos de la matriz:");
        for (int i = 0; i < 2; i++)
        {
            for (int j = 0; j < 2; j++)
            {
                Console.WriteLine(matriz[i, j]);
            }
        }
    }
}

Lenguaje del código: C# (cs)

3) Simulación del Comportamiento de un Diccionario:

Vamos a crear una clase que simule el comportamiento de un diccionario utilizando indexadores en C#. Esta clase permitirá agregar, eliminar y acceder a elementos como lo harías con un diccionario estándar de C#.

Aquí tienes un ejemplo:


using System;
using System.Collections.Generic;

public class MiDiccionario<TKey, TValue>
{
    private Dictionary<TKey, TValue> datos = new Dictionary<TKey, TValue>();

    public TValue this[TKey key]
    {
        get { return datos[key]; }
        set { datos[key] = value; }
    }

    public int Count => datos.Count;
}

class Program
{
    static void Main(string[] args)
    {
        MiDiccionario<string, int> diccionario = new MiDiccionario<string, int>();
        diccionario["uno"] = 1;
        diccionario["dos"] = 2;
        diccionario["tres"] = 3;

        Console.WriteLine("Elementos del diccionario:");
        foreach (var kvp in diccionario)
        {
            Console.WriteLine($"Clave: {kvp.Key}, Valor: {kvp.Value}");
        }
    }
}

Lenguaje del código: C# (cs)

Estos ejemplos demuestran cómo puedes utilizar indexadores en C# para implementar una lista personalizada, acceder a elementos de una matriz multidimensional y simular el comportamiento de un diccionario. ¡Espero que te sean útiles para comprender mejor cómo aprovechar esta característica en tus propios proyectos!