Pregunta

Estoy eliminando esta línea después de haber visitado diferentes sitios web para tratar de comprender el ejemplo en tiempo real del uso de la enumeración personalizada. Tengo ejemplos. Pero me llevan a la confusión.

Ejemplo

Toma 1

class NumberArray
{
    public int[] scores;

    public NumberArray()
    {
    }

    public NumberArray(int[] scores)
    {
        this.scores = scores;
    }

    public int[] Scores
    {
        get {return scores;}
    }

}

Take 2

public class Enumerator : IEnumerator
{
    int[] scores;
    int cur;
    public Enumerator(int[] scores)
    {
        this.scores = scores;
        cur = -1;
    }
    public Object Current
    {
        get {
            return scores[cur];
        }
    }

    public void Reset()
    {
        cur = -1;
    }

    public bool MoveNext()
    {
        cur++;
        if (cur < scores.Length)
            return true;
        else return false;
    }
}

public class Enumerable : IEnumerable
{
    int[] numbers;

    public void GetNumbersForEnumeration(int[] values)
    {
        numbers = values;
        for (int i = 0; i < values.Length; i++)
            numbers[i] = values[i];
    }

    public IEnumerator GetEnumerator()
    {
        return new Enumerator(numbers);
    }
}

Main

static void Main()
{
    int[] arr = new int[] { 1, 2, 3, 4, 5 };
    NumberArray num = new NumberArray(arr);
    foreach(int val in num.Scores)
    {
        Console.WriteLine(val);
    }

    Enumerable en = new Enumerable();
    en.GetNumbersForEnumeration(arr);

    foreach (int i in en)
    {
        Console.WriteLine(i);
    }
    Console.ReadKey(true);
}

En la toma 2, seguí la iteración personalizada para iterar la misma matriz de enteros que hice en toma 1. ¿Por qué debo batir sobre el arbusto para iterar un entero usando una iteración personalizada ?

Probablemente me perdí la iteración personalizada en tiempo real . ¿Me puede explicar la tarea que no puedo hacer con la facilidad de iteración existente? ( Acabo de terminar mi educación, dame un ejemplo sencillo para que pueda entenderlo correctamente ).

Actualización: Tomé esos ejemplos de algún sitio. No hay nada especial en ese código, podemos lograrlo de manera muy simple, incluso sin usar una iteración personalizada, mi interés era conocer el escenario real donde la iteración personalizada es muy útil.

¿Fue útil?

Solución

Los iteradores personalizados son útiles cuando los recursos que está iterando no están precargados en la memoria, sino que se obtienen según sea necesario en cada iteración. Por ejemplo, en LINQ to SQL, cuando haces algo como:

foreach(var employee in dataContext.Employees) {
    // Process employee
}

en cada paso del bucle foreach , se consulta la tabla de Empleados en la base de datos para obtener el siguiente registro. De esta manera, si sale temprano del ciclo, no ha leído toda la tabla, sino solo los registros que necesitaba.

Vea aquí un ejemplo del mundo real: enumere líneas en un archivo . Aquí, cada línea se lee del archivo en cada iteración del bucle foreach . (Como nota al margen, .NET Framework 4 ofrece esta misma funcionalidad incorporada).

Otros consejos

Para ser honesto, no estoy completamente seguro de lo que estás preguntando, pero si te preocupa la diferencia entre devolver una matriz (como en la toma 1) y devolver un iterador (tomar 2), aquí está mi respuesta .

Hay una gran diferencia entre devolver una matriz y devolver un iterador. Devolver una matriz significa devolver un estado interno (a menos que haga una copia como parte de la devolución, pero eso es costoso). Si devuelve un iterador, simplemente devuelve una abstracción, que permitirá a las personas que llaman iterar. Esto también significa que puede hacer una evaluación perezosa si lo necesita (algo que obviamente no puede hacer si está devolviendo una matriz).

Además, con el soporte para iteradores en C # 2, realmente no hay razón para implementar IEnumerable a mano. Consulte esta pregunta para obtener detalles adicionales ¿Puede alguien desmitificar la palabra clave de rendimiento?

Como otro ejemplo en el que la iteración personalizada me ha sido útil en el pasado fue proporcionar una abstracción común para enumerar recursivamente todos los nodos en una estructura de árbol ...

foreach (Node n in tree)
  //...do something
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top