Question

Je laisse tomber cette ligne après avoir visité différents sites Web pour essayer de comprendre un exemple en temps réel d'utilisation d'une énumération personnalisée. J'ai eu des exemples. Mais ils me mènent à la confusion.

Exemple

Prenez 1

class NumberArray
{
    public int[] scores;

    public NumberArray()
    {
    }

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

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

}

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

Principal

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

Dans prendre 2, j'ai suivi l'itération personnalisée pour itérer le même tableau entier que je l'ai fait dans prendre 1. Pourquoi devrais-je faire le tour du pot pour itérer un entier en utilisant une itération personnalisée ?

J'ai probablement manqué le besoin d'itération personnalisée en temps réel . Pouvez-vous m'expliquer la tâche que je ne peux pas faire avec le système d'itération existant? ( Je viens de terminer mes études, alors donnez-moi un exemple simple pour que je puisse bien le comprendre ).

Mise à jour: J'ai pris ces exemples sur un site. Il n’ya rien de spécial dans ce code, nous pouvons le réaliser très simplement, même sans utiliser l’itération personnalisée. Mon intérêt était de connaître le scénario réel dans lequel l’itération personnalisée est assez pratique.

Était-ce utile?

La solution

Les itérateurs personnalisés sont utiles lorsque les ressources que vous effectuez ne sont pas préchargées en mémoire, mais sont obtenues au besoin lors de chaque itération. Par exemple, dans LINQ to SQL, lorsque vous faites quelque chose comme:

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

à chaque étape de la boucle foreach , la table Employees de la base de données est interrogée pour obtenir le prochain enregistrement. Ainsi, si vous quittez la boucle plus tôt que prévu, vous n’avez pas lu toute la table, mais uniquement les enregistrements dont vous aviez besoin.

Voir ici pour un exemple concret: énumérer les lignes d'un fichier . Ici, chaque ligne est lue dans le fichier à chaque itération de la boucle foreach . (remarque: .NET Framework 4 offre cette même fonctionnalité intégrée).

Autres conseils

Pour être honnête, je ne suis pas tout à fait sûr de ce que vous demandez, mais si vous êtes préoccupé par la différence entre renvoyer un tableau (comme dans la prise 1) et retourner un itérateur (prendre 2), voici ma réponse. .

Il existe une grande différence entre renvoyer un tableau et renvoyer un itérateur. Le renvoi d'un tableau signifie le retour de l'état interne (à moins que vous ne fassiez une copie dans le retour, mais cela coûte cher). Si vous renvoyez un itérateur, vous renvoyez simplement une abstraction, ce qui permettra aux appelants d'itérer l'état. Cela signifie également que vous pouvez effectuer des évaluations paresseuses si vous en avez besoin (ce que vous ne pouvez évidemment pas faire si vous renvoyez un tableau).

En outre, avec la prise en charge des itérateurs en C # 2, il n’ya vraiment aucune raison de mettre en œuvre IEnumerable manuellement. Veuillez consulter cette question pour plus de précisions Peut-on démystifier le mot clé de rendement?

Un autre exemple d'utilisation de l'itération personnalisée dans le passé consistait à fournir une abstraction commune permettant d'énumérer de manière récursive tous les noeuds d'une structure arborescente ...

foreach (Node n in tree)
  //...do something
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top