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. P>
10 Réponses :
Itérer à travers les étudiants d'une classe p>
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. P> blockQuote>
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> code>. +1 Owen qui a effectivement donné un exemple où les itérateurs seraient utiles.
Itérer à travers un ensemble de questions de devoirs. p>
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. P>
Lire les deux premiers paragraphes ici pour un peu plus d'informations. P>
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. P>
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 ... p>
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. P>
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
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. P>
Exemple simple: une fonction qui génère une séquence d'entiers: Pour le faire sans itérateur, vous auriez besoin de créer un tableau puis de l'énumérer ... P> p>
Sans itérateur, comment voudriez-vous l'énumérer? : p
@Svish: avec un Enumerator i>, pas un itérateur;)
Le code fonctionne-t-il vraiment pour des séquences descendantes? Vous testez i <= tovalue code>. Quel est le but de
direction code>?
@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 code> contient un moyen de générer une séquence ascendante d'entiers via une exécution différée,
énumérable.Range code>
+1 de toute façon
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"); }
Je seconde que, mais supprimera mon bowvote si vous réécrivez cela comme un itérateur.
Pas exactement vrai. Un itérateur implicite est créé. Voir EN.Wikipedia.org/wiki/iterator#Implicit_atives
Toujours pas un itérateur. Je vous suggère d'essayer ce lien que j'ai posté pour Rohit dans les commentaires à la question.
Max - Certaines langues appellent cet itérateur. Spécifiquement, la question fait référence à des «blocs d'itérateur» qui sont généralement connus un générateur. En F #, ils sont appelés "expressions de séquence". L'itérateur dans Java Maps est à peu près exactement sur le .NET iEnumerable. La plupart des développeurs C # prenaient des "itérateurs" pour signifier des blocs d'itérateurs avec rendement de rendement (voir mon exemple) TreateGhr que des instances d'énumérateur simples.
à 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 ... P>
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; } }
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> afin que vous puissiez obtenir un énumérateur de celui-ci. Cette interface (à nouveau, simplifiant légèrement pour éliminer le bruit distrayant): p> 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;
}
Mais que si je veux le bagage historique et le bruit distrayant?
Cela vous indique quelque chose à propos de la recherche de Google pour des réponses.
Essayez msdn.microsoft.com/en-us/library/dscyy5s0.aspx A> à 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 i> 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 i> 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.