indexadores entonces c# indexer

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



entonces en c# (14)

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 existe una pregunta relacionada , pero no me sirve de mucho.


Adición a @ code-reyes post.

Además, al llamar a RollNumberVariable[0] se activará el comportamiento del indexador de la colección predeterminada. Mientras que los indexadores son en realidad propiedades , es en su nombre para escribir su propia lógica al extraer datos. Puede delegar fácilmente la mayor parte del valor del parámetro de índice en la colección interna, pero también puede devolver cualquier valor arbitrario para ciertos valores de índice.

Solo un ejemplo: puede tener más de 2 colecciones internas en diferentes formatos, pero el usuario externo interactuará con ellas a través de un único indexador (que funcionará como un despachador), mientras que esa colección estará oculta. Esto más bien fomenta el principio de encapsulación.


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.


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.


Es solo azúcar sintáctico para las clases de tipos 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.


Estoy tratando de obtener imágenes de un archivo de secuencia. Necesito algún tipo de matriz 2D o una matriz dentada para mantener los valores de píxeles. Estoy usando indexadores en lugar de matrices porque el bucle sobre los indexadores es más rápido que el bucle sobre matrices 2D o irregulares.


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ía "for(int i = 0; i < myarray.length; i++) { if (i = 3) then { .. do stuff } }" (¡no es que alguna vez quiera!), 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 forma conveniente de obtener datos de algo.


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 los usa con bastante frecuencia.


Microsoft tiene un ejemplo que usa 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); } }


Puede usar un indexador para proporcionar elegantemente la sincronización de lectura y escritura de varios subprocesos a un diccionario que no sea seguro para subprocesos (o cualquier colección que no sea segura para subprocesos):

internal class ThreadSafeIndexerClass { public object this[int key] { get { // Aquire returns IDisposable and does Enter() Exit() on a certain ReaderWriterLockSlim instance using (_readLock.Aquire()) { object subset; _dictionary.TryGetValue(key, out foundValue); return foundValue; } } set { // Aquire returns IDisposable and does Enter() Exit() on a certain ReaderWriterLockSlim instance using (_writeLock.Aquire()) _dictionary[key] = value; } } }

Útil especialmente cuando no quiere usar el peso pesado ConcurrentDictionary (o cualquier otra colección concurrente).


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


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


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


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

}


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