1 votes

Quelle est la raison d'être de IEnumerable ?

Pourquoi pensez-vous que Microsoft veut que l'on passe par IEnumerable pour arriver à IEnumerator ? La présence ou l'absence d'un cast valide vers IEnumerator pour un type donné n'est-elle pas suffisante pour déterminer si le type est énumérable ou non ?

Par exemple, qu'est-ce qui ne va pas avec ce qui suit ?

class MyClass : IEnumerator
{
    ...
}

MyClass myObj = new MyClass();

if(myObj as IEnumerator != null)
{
    Console.WriteLine("myObj is enumerable");
}
else
{
    Console.WriteLine("myObj doesn't support enumeration");
}

10voto

Joe Points 60749

Vous pouvez avoir deux threads qui énumèrent - chacun a besoin de son propre énumérateur.

IEnumerable.GetEnumerator renvoie un énumérateur qui est initialement positionné avant le premier élément de la collection. Si vous n'aviez que IEnumerator, vous devriez vous rappeler de vous réinitialiser avant de l'utiliser, même dans un scénario à un seul thread.

5voto

devio Points 22981

Un IEnumerator contient les informations d'état nécessaires à l'exécution de l'énumération, comme l'index du tableau, etc.

L'information sur l'état de l'énumération ne fait PAS partie de l'objet énumérable, donc le casting ne serait pas assez puissant.

De plus, la séparation énumérateur/énumérable permet d'effectuer plusieurs énumérations simultanément sur la même collection énumérable.

1voto

Harald Scheirich Points 7227

Il s'agit de séparer les responsabilités, IEnumerable est une classe qui peut être itérée sur IEnumerator est une classe qui fait l'itération.

1voto

Daniel Earwicker Points 63298

La réponse acceptée parle de multithreading, mais les algorithmes monofilaires seraient eux aussi sévèrement limités. Se souvenir de réinitialiser la liste au début ne serait pas un problème avec foreach pour vous aider, mais supposons que vous vouliez comparer chaque élément de la liste avec chaque autre élément :

int matchCount = 0;

foreach (var x in myList)
{
    foreach (var y in myList)
    {
        if (x == y)
            matchCount++;
    }
}

matchCount /= 2;

Si la "position actuelle" était stockée dans l'objet liste, les boucles internes et externes se battraient sur le même emplacement pour stocker leur position actuelle. On peut supposer que la boucle interne s'exécuterait une fois, puis que la boucle externe sortirait, ayant constaté qu'elle se trouve au-delà de la fin de la liste.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X