2010-08-27 3 views
15

Je me demandais, exactement quand puis-je utiliser la boucle foreach? Dois-je implémenter IEnumerable?IEnumerable est-il requis pour utiliser une boucle foreach?

+6

[Première réponse] (http://msdn.microsoft.com/fr-fr/library/ttw7t8t6%28VS.80%29.aspx) sur Google. – pascal

+0

http://msdn.microsoft.com/en-us/library/9yb8xew9(VS.80).aspx – Dave

+12

Vous pouvez les utiliser les mardis et jeudis et pendant le cinquième week-end d'un mois civil. –

Répondre

2

Vous pouvez foreach si un objet qui implémente IEnumerable ou IEnumberable<T>

37

Il n'y a pas besoin d'implémenter l'interface IEnumerable d'utiliser l'instruction foreach. Voici une citation du MSDN (http://msdn.microsoft.com/en-us/library/9yb8xew9.aspx):

En C#, il est pas absolument nécessaire pour une classe de collection d'hériter de IEnumerable et IEnumerator pour être compatible avec foreach. Tant que comme la classe a le requis GetEnumerator, MoveNext, Reset, et Les membres actuels, il travaillera avec foreach. Omettre les interfaces a l'avantage de vous permettre de définir le type de retour de courant à être plus spécifique que l'objet, ce qui assure la sécurité de type.

+0

Comme celui-ci car il indique correctement 'IEnumerable' n'est pas requis. Cela rend certainement la vie plus facile, cependant. –

+4

C'est vraiment intéressant, et je ne le savais pas. Mais je suppose que c'était principalement pour supporter la sécurité de type dans .NET 1.0. Je dirais que la meilleure façon d'assurer la sécurité des types de nos jours est d'utiliser la version générique de IEnumerable. –

+0

+1 Apprendre quelque chose de nouveau chaque jour. – BoltClock

2

Demandez-vous - avez-vous vraiment besoin d'un compteur de boucle

La règle de base que j'utilise est de déterminer si je me déplace des données entre deux conteneurs indexés, où je fais vraiment besoin d'une valeur d'index pour adresser la destination, ou plus généralement, «ai-je besoin d'un compte d'index pour chaque élément que je traite dans la boucle»? Dans ces cas, j'utilise une boucle for, dans presque tous les autres cas (où foreach peut gérer le conteneur, ce qui, comme indiqué ci-dessus, concerne à peu près tous les conteneurs), la raison est plutôt simple, Ensuite, il faut prendre la peine de maintenir manuellement un compteur de boucles.