Pregunta ¿Casos de uso del mundo real para los indexadores de C #?


He visto muchos ejemplos de indexadores c #, pero de qué manera me ayudará en situaciones de la vida real.

Sé que el gurú de C # no habría agregado esto si no fuera una característica seria, pero no puedo pensar en una situación del mundo real (no en las cosas de la barra foo) para usar indexadores.

Nota: me doy cuenta de que pregunta relacionada existe, pero no me ayuda mucho.


43
2018-02-02 15:15


origen


Respuestas:


La forma en que veo los indexadores es que (acierto o incorrecto), acceder a algo por índice debería ser más eficiente que acceder a él de otra forma, porque de alguna forma, forma o forma, la clase cuyo indexador estoy usando almacena alguna forma de índice que le permite buscar valores rápidamente cuando se accede de esa manera.

El ejemplo clásico es una matriz, cuando accede al elemento n de una matriz mediante el uso del código myarray [3], el compilador / intérprete sabe cuán grandes son (en cuanto a la memoria) los elementos de la matriz y puede tratarlo como un desplazamiento del inicio de la matriz. También podrías "for(int i = 0; i < myarray.length; i++) { if (i = 3) then { .. do stuff } }" (¡No es que alguna vez quieras!), que sería menos eficiente. También muestra cómo una matriz es un mal ejemplo.

Digamos que tienes una clase de colección que almacena, umm, DVD, así que:

public class DVDCollection
{
    private Dictionary<string, DVD> store = null;
    private Dictionary<ProductId, string> dvdsByProductId = null;

    public DVDCollection()
    {
        // gets DVD data from somewhere and stores it *by* TITLE in "store"
        // stores a lookup set of DVD ProductId's and names in "dvdsByProductid"
        store = new Dictionary<string, DVD>();
        dvdsByProductId = new Dictionary<ProductId, string>();
    }

    // Get the DVD concerned, using an index, by product Id
    public DVD this[ProductId index]  
    {
       var title = dvdsByProductId[index];
       return store[title];
    }
}

Solo mi 2p, pero, como dije, siempre he considerado un "indexador" como una manera conveniente de obtener datos de algo.


32
2018-02-02 15:28



Los ejemplos más obvios, como lo menciona Skurmedel, son List<T> y Dictionary<TKey, TValue>. ¿Qué preferirías sobre:

List<string> list = new List<string> { "a", "b", "c" };
string value = list[1]; // This is using an indexer

Dictionary<string, string> dictionary = new Dictionary<string, string>
{
    { "foo", "bar" },
    { "x", "y" }
};
string value = dictionary["x"]; // This is using an indexer

? Ahora puede ser relativamente raro que necesite escribir un indexador (generalmente cuando está creando una clase similar a una colección), pero sospecho que utilizar ellos razonablemente frecuentemente.


24
2018-02-02 15:26



Microsoft tiene un ejemplo usando un indexador para tratar un archivo como una matriz de bytes.

public byte this[long index]
{
    // Read one byte at offset index and return it.
    get 
    {
        byte[] buffer = new byte[1];
        stream.Seek(index, SeekOrigin.Begin);
        stream.Read(buffer, 0, 1);
        return buffer[0];
    }
    // Write one byte at offset index and return it.
    set 
    {
        byte[] buffer = new byte[1] {value};
        stream.Seek(index, SeekOrigin.Begin);
        stream.Write(buffer, 0, 1);
    }
}

9
2018-02-02 15:21



Supongamos que tiene una colección de objetos que desea poder indexar por un orden distinto al orden en que se colocó en una colección. En el ejemplo siguiente, puede ver cómo puede usar la propiedad 'Ubicación' de algún objeto y usar el indexador, devolver todos los objetos de la colección que coinciden con su ubicación o, en el segundo ejemplo, todos los objetos que contienen un determinado Conteo ( ) de objetos.

class MyCollection {

  public IEnumerable<MyObject> this[string indexer] {
    get{ return this.Where(p => p.Location == indexer); }
  }

  public IEnumerable<MyObject> this[int size] {
    get{ return this.Where(p => p.Count() == size);}
  }
}

5
2018-02-02 15:19



Una vez que .NET obtuvo genéricos, la mayor razón para que implementara un indexador (para implementar una colección fuertemente tipada) desapareció.


5
2018-02-02 15:19



Es sólo Azúcar sintáctico para las clases de tipo de colección. Nunca tuve una razón para escribir tal clase. Así que creo que hay usos muy raros de él en "la vida real", porque las clases que lo usan ya están implementadas.


3
2018-02-02 15:23



En ASP.Net, hay algunos momentos diferentes en los que se utiliza un indexador, como leer algo de cualquiera de los objetos Solicitud, Sesión o Aplicación. He visto a menudo dónde se almacena algo en el objeto Session o Application solo para usarlo una y otra vez.


3
2018-02-02 15:33



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace IndexerSample
{
    class FailSoftArray 
    {
        int[] a; // reference to underlying array
        public int Length; // Length is public
        public bool ErrFlag; // indicates outcome of last operation
        // Construct array given its size.
        public FailSoftArray(int size)
        {
            a = new int[size];
            Length = size;
        }
        // This is the indexer for FailSoftArray.
        public int this[int index] 
        {
        // This is the get accessor.
            get
            {
                if (ok(index))
                {
                    ErrFlag = false;
                    return a[index];
                }
                else
                {
                    ErrFlag = true;
                    return 0;
                }
            }
            // This is the set accessor.
            set
            {
                if (ok(index))
                {
                    a[index] = value;
                    ErrFlag = false;
                }
                else ErrFlag = true;
            }
        }
        // Return true if index is within bounds.
        private bool ok(int index)
        {
            if (index >= 0 & index < Length) return true;
            return false;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            FailSoftArray fs = new FailSoftArray(5);
            int x;
            // Show quiet failures.
            Console.WriteLine("Fail quietly.");
            for (int i = 0; i < (fs.Length * 2); i++)
                fs[i] = i * 10;
            for (int i = 0; i < (fs.Length * 2); i++)
            {
                x = fs[i];
                if (x != -1) Console.Write(x + " ");
            }
            Console.WriteLine();
            // Now, display failures.
            Console.WriteLine("\nFail with error reports.");
            for (int i = 0; i < (fs.Length * 2); i++)
            {
                fs[i] = i * 10;
                if (fs.ErrFlag)
                    Console.WriteLine("fs[" + i + "] out-of-bounds");
            }
            for (int i = 0; i < (fs.Length * 2); i++)
            {
                x = fs[i];
                if (!fs.ErrFlag) Console.Write(x + " ");
                else
                    Console.WriteLine("fs[" + i + "] out-of-bounds");
            }
            Console.ReadLine();
        }
    }
}

2
2018-05-03 11:51



http://code-kings.blogspot.in/2012/09/indexers-in-c-5.html

Los indexadores son elementos en un programa de C # que permiten que una clase se comporte como una matriz. Podrías usar toda la clase como una matriz. En este conjunto, puede almacenar cualquier tipo de variables. Las variables se almacenan en una ubicación separada, pero se direccionan por el nombre de la clase en sí. Crear índices para enteros, cadenas, booleanos, etc. sería una idea viable. Estos indexadores actuarían efectivamente sobre los objetos de la clase.

Supongamos que ha creado un indexador de clase que almacena el número de rollo de un alumno en una clase. Además, supongamos que ha creado un objeto de esta clase llamado obj1. Cuando dice obj1 [0], se refiere al primer alumno en rollo. Del mismo modo, obj1 [1] se refiere al 2º alumno en rollo.

Por lo tanto, el objeto toma valores indexados para hacer referencia a la variable Integer que se almacena de forma privada o pública en la clase. Supongamos que no tiene esta instalación, entonces probablemente se referiría de esta manera (que sería más larga):

obj1.RollNumberVariable[0]
obj1.RollNumberVariable[1]. 

donde RollNumberVariable sería la variable entera que hace referencia al número de rollo del objeto actual del estudiante.

Para más detalles http://code-kings.blogspot.in/2012/09/indexers-in-c-5.html


2
2017-10-11 08:10



Aquí hay un video que he creado http://www.youtube.com/watch?v=HdtEQqu0yOY y abajo hay una explicación detallada sobre el mismo.

Indexers ayuda a acceder a la colección contenida en una clase utilizando una interfaz simplificada. Es un azúcar sintáctico.

Por ejemplo, digamos que tiene una clase de cliente con colección de direcciones dentro de ella. Ahora digamos que nos gustaría obtener la colección de direcciones por "Pincode" y "PhoneNumber". Por lo tanto, el paso lógico sería ir y crear dos funciones sobrecargadas, una que se obtiene utilizando "PhoneNumber" y la otra mediante "PinCode". Puedes ver en el siguiente código que tenemos dos funciones definidas.

Customer Customers = new Customer();
Customers.getAddress(1001);
Customers.getAddress("9090");

Si usa el indexador, puede simplificar el código anterior con algo como se muestra en el siguiente código.

Customer Customers = new Customer();
Address o = Customers[10001];
o = Customers["4320948"];

Aclamaciones.


1
2018-04-18 01:47



http://code-kings.blogspot.in/2012/09/indexers-in-c-5.html

usando el sistema;

espacio de nombres Indexers_Example

{

class Indexers
{

    private Int16[] RollNumberVariable;

    public Indexers(Int16 size)
    {
        RollNumberVariable = new Int16[size];

        for (int i = 0; i < size; i++)
        {
            RollNumberVariable[i] = 0;
        }
    }

    public Int16 this[int pos]
    {
        get
        {
            return RollNumberVariable[pos];
        }
        set
        {
            RollNumberVariable[pos] = value;
        }
    }
}

}


0
2017-10-11 08:16