12
votes

Pourquoi avons-nous besoin d'itérateurs en C #?

Quelqu'un peut-il offrir un exemple de vie réel sur l'utilisation d'itérateurs. J'ai essayé de chercher google mais n'a pas été satisfait des réponses.


17 commentaires

Cela vous indique quelque chose à propos de la recherche de Google pour des réponses.


Essayez msdn.microsoft.com/en-us/library/dscyy5s0.aspx à la place.


Vous n'êtes pas facilement satisfait ou vous n'avez pas cherché assez fort.


Essayez également social.msdn.microsoft.com / Rechercher / en-US / ... . Je ne comprendrai jamais pourquoi les gens ne recherchent pas d'abord le site Web du fournisseur. Alors Google.


Vous n'avez pas trouvé Ceci ?


Ok, c'est donc une question stupide, mais comment est-ce "pas une question"? C'est l'une des questions stupides les plus claires que j'ai vues toute la semaine.


Pourquoi vous êtes coincé dans une ornière et vous ne pouvez pas trouver une voie à suivre, vous appelez l'itérateur. Lorsque les ODSS sont contre vous et que vous n'avez personne d'autre à se tourner vers alors vous appelez l'énumérateur.


merci@ John, j'étais curieux de connaître de bonnes réponses qui ne sont pas disponibles via Google.Le pourquoi je mets des questions aussi bêtes. J'ai des milliers de threads qui décrivent des termes techniques purs ce qu'un indexeur est, mais je n'ai pas trouvé quoi j'ai voulu.


@Rohit: De rien. S'il vous plaît dites-moi pourquoi vous n'avez pas essayé d'abord MSDN.


J'ai essayé MSDN, j'ai essayé l'excellent post de Jon Skeet sur elle. J'ai essayé de lire C # en profondeur mais vous a dit la raison.


@Closer: Allez, des gens, je pense que si vous ne fermez pas une vraie question, vous êtes obligé d'ajouter un commentaire disant pourquoi. Sinon, je suis obligé de conclure que vous ne comprenez pas ce que signifie "pas une vraie question".


@Rohit: sérieusement? Je viens de taper dans "Itérateur" et a donné la suggestion, "C # Itérateur", et il y avait la réponse. Peut-être que vous n'avez pas fait une recherche, mais plutôt piquer?


Ok John, après aujourd'hui, je vais me porter mon cerveau sur Google avant de poser une question.


@Rohit: Non, pas Google, msdn.microsoft.com. Et seulement pour le reste de la semaine. Essayez d'abord MSDN si vous avez une question Microsoft, et alors Google.


@John Saunders: Je suis en désaccord. Et si, pour une raison quelconque, vous ne connaissez pas le vendeur? Pour moi, même lorsque je sais qu'ils sont des articles MSDN, je recherche Google d'abord (après que toute la zone de recherche Google est toujours prête) et, dans la plupart des cas, je me retrouve avec un lien direct vers l'article MSDN approprié de toute façon.


Je fais la recherche de site sur msdn.microsoft.com d'abord en utilisant Google, puis Google. :)


Les itérateurs sont faits pour compliquer le monde! Un autre morceau pour rendre oo plus difficile à utiliser et à comprendre ... je vous évite à haute voix ici.


10 Réponses :


4
votes

Itérer à travers les étudiants d'une classe

Le modèle de conception itérateur fournit nous avec une méthode courante d'énumération une liste d'articles ou d'une matrice, tout en cache les détails de la liste la mise en oeuvre. Cela fournit un Utilisation du nettoyeur de l'objet Array et cache des informations non ignifuges de le client, menant finalement à meilleure réutilisation de codes, améliorée la maintenabilité et moins de bugs. Le motif itérateur peut énumérer le Liste des articles indépendamment de leur Type de stockage réel.


6 commentaires

Pourquoi ne pas créer un tableau d'étudiants et utiliser l'index.


Pourquoi ne pas créer autant d'étudiants que nécessaire, chacune sa propre variable


Pourquoi ne pas les faire variables globales aussi, ils sont donc plus faciles à référencer n'importe où dans votre programme?


@Bryan: Mon collège avait plus de 20 000 étudiants. Si vous avez envie de faire de nombreuses variables, allez-y à l'avance. @Rohit: Et si ce n'est pas des étudiants, mais des fichiers sur un système de fichiers disposé dans un modèle d'arborescence? L'arbre peut être stocké dans un tableau, mais vous devrez faire beaucoup d'astuces d'indexation pour le faire correctement.


@Owenp: espérons-le tous tous dans une classe :)


@Bryan @winston @kyle très amusant, mais le commentaire de Rohit est une question parfaitement raisonnable, bien qu'il soit préférable de suggérer list <étudiant> . +1 Owen qui a effectivement donné un exemple où les itérateurs seraient utiles.



3
votes

Itérer à travers un ensemble de questions de devoirs.

mais sérieusement, les itérateurs peuvent fournir une manière unifiée de traverser les éléments d'une collection indépendamment de la structure de données sous-jacente.

Lire les deux premiers paragraphes ici pour un peu plus d'informations.


0 commentaires

2
votes

Quelques choses sont excellentes pour:
a) Pour «performance perçue» tout en maintenant la propreté de code - l'itération de quelque chose séparé de la logique de traitement.
b) Lorsque le nombre d'articles que vous allez à itérer n'est pas connu.

Bien que les deux puissent être faits à travers d'autres moyens, avec des itérateurs, le code peut être rendu plus agréable et sensible car quelqu'un appelle que l'itérateur n'a pas besoin de s'inquiéter de la manière dont il trouve la matière à itérer ...

Exemple de vie réel: énumérer des annuaires et des fichiers et de trouver le premier [n] qui remplissent certains critères, par exemple. Un fichier contenant une certaine chaîne ou une séquence, etc.


0 commentaires

1
votes

Un itérateur est un moyen facile de mettre en œuvre l'interface d'ienumerator. Au lieu de faire une classe qui présente les méthodes et les propriétés requises pour l'interface, vous faites simplement une méthode qui renvoie les valeurs un par un et le compilateur crée une classe avec les méthodes et les propriétés nécessaires à la mise en oeuvre de l'interface.

Si vous Par exemple, ont une liste importante de nombres et vous souhaitez renvoyer une collection dans laquelle chaque numéro est multiplié par deux, vous pouvez créer un itérateur qui renvoie les numéros au lieu de créer une copie de la liste en mémoire: P>

from n in originalList select n * 2


0 commentaires

12
votes

Les itérateurs sont une abstraction qui découle le concept de position dans une collection de la collection elle-même. L'itérateur est un objet distinct stockant l'état nécessaire pour localiser un élément de la collection et passer à l'élément suivant de la collection. J'ai vu des collections qui gardaient cet état à l'intérieur de la collection (c'est-à-dire une position actuelle), mais il est souvent préférable de déplacer cet état à un objet externe. Entre autres choses, il vous permet d'avoir plusieurs itérateurs itérant la même collection.


0 commentaires

6
votes

Exemple simple: une fonction qui génère une séquence d'entiers: xxx

Pour le faire sans itérateur, vous auriez besoin de créer un tableau puis de l'énumérer ...


5 commentaires

Sans itérateur, comment voudriez-vous l'énumérer? : p


@Svish: avec un Enumerator , pas un itérateur;)


Le code fonctionne-t-il vraiment pour des séquences descendantes? Vous testez i <= tovalue . Quel est le but de direction ?


@MarkJ, bien repéré! Je n'ai pas testé ce code et, apparemment, cela ne fonctionnera pas pour des séquences décroissantes. Je vais le réparer dans une minute


@Thomas content que cela ait aidé! Il convient également de mentionner que system.linq contient un moyen de générer une séquence ascendante d'entiers via une exécution différée, énumérable.Range +1 de toute façon



1
votes
IEnumerator<Question> myIterator = listOfStackOverFlowQuestions.GetEnumerator();
while (myIterator.MoveNext())
{
  Question q;
  q = myIterator.Current;
  if (q.Pertinent == true)
     PublishQuestion(q);
  else
     SendMessage(q.Author.EmailAddress, "Your question has been rejected");
}


foreach (Question q in listOfStackOverFlowQuestions)
{
    if (q.Pertinent == true)
        PublishQuestion(q);
    else    
        SendMessage(q.Author.EmailAddress, "Your question has been rejected");
}


2
votes

à côté de tout le reste, à itérer à travers des séquences de type paresseux - ienumerators. Chaque élément suivant de cette séquence peut être évalué / initialisé lors de l'étape d'itération, ce qui permet de se déplacer à travers des séquences infinies à l'aide de la quantité finie de ressources ...


0 commentaires

2
votes

L'exemple canonique et le plus simple est qu'il présente des séquences infinies possibles sans la complexité de devoir écrire la classe pour le faire vous-même:

// generate every power of a number from start^0 to start^n
public IEnumerator<int> GetPowersEnumerator(int start)
{   
    yield return 1; // anything ^0 is 1
    var x = start;
    while(true)
    {
        yield return x;
        x *= start;
    }      
}


0 commentaires

16
votes

Vous avez probablement entendu parler de matrices et de conteneurs - des objets qui stockent une liste d'autres objets.

mais pour qu'un objet représente une liste, il n'a pas vraiment à "stocker" la liste. Tout ce qu'il faut faire est de vous fournir des méthodes ou des propriétés qui vous permettent d'obtenir les éléments de la liste. P>

dans la structure .NET, l'interface iEnumerable est tout un objet doit prendre en charge une" liste "dans ce sens. P>

à Simplifiez-le un peu (laissant des bagages historiques): p> xxx pré>

afin que vous puissiez obtenir un énumérateur de celui-ci. Cette interface (à nouveau, simplifiant légèrement pour éliminer le bruit distrayant): p> xxx pré>

de manière à boucler dans une liste, vous le feriez: P>

IEnumerable<int> GetNumbers(int stop)
{
    for (int n = 0; n < stop; n++)
        yield return n;
}


1 commentaires

Mais que si je veux le bagage historique et le bruit distrayant?