Je rencontre cela souvent pendant la programmation où je veux avoir un index de comptage de boucles à l'intérieur d'un foreach et devoir créer un entier, l'utiliser, l'incrémenter, etc. Ne serait-ce pas une bonne idée s'il y avait un mot-clé introduit qui était le nombre de boucles à l'intérieur d'un foreach? Il pourrait également être utilisé dans d'autres boucles.
Est-ce que cela va à l'encontre de l'utilisation de mots clés, car le compilateur ne permettrait pas que ce mot clé soit utilisé ailleurs que dans une construction en boucle?
for ()
boucle.Réponses:
Si vous avez besoin d'un nombre de boucles à l'intérieur d'une
foreach
boucle, pourquoi ne pas simplement utiliser unefor
boucle régulière . Laforeach
boucle était destinée àfor
simplifier les utilisations spécifiques des boucles. Il semble que vous ayez une situation où la simplicité duforeach
n'est plus bénéfique.la source
IEnumerable.Count
pourrait être coûteux (ou impossible, s'il s'agit d'une seule énumération). Vous devez savoir quelle est la source sous-jacente avant de pouvoir le faire en toute sécurité.foreach
plusfor (int i = 0…)
. Il a écrit quelques pages mais je peux résumer en deux mots - optimisation du compilateur à l'itération. Ok, ce n'était pas deux mots.for
boucle donne un meilleur code lisible (et l'optimisation théorique du compilateur est souvent une optimisation prématurée).Vous pouvez utiliser des types anonymes comme celui-ci
Ceci est similaire à la
enumerate
fonction de Pythonla source
J'ajoute simplement la réponse de Dan Finch ici, comme demandé.
Ne me donne pas de points, donne des points à Dan Finch :-)
La solution consiste à écrire la méthode d'extension générique suivante:
Qui est utilisé comme ça:
la source
Je peux me tromper à ce sujet, mais j'ai toujours pensé que le point principal de la boucle foreach était de simplifier l'itération à partir des jours STL de C ++, c'est-à-dire
comparer cela à l'utilisation par INET de IEnumerable dans foreach
ce dernier est beaucoup plus simple et évite bon nombre des pièges anciens. De plus, ils semblent suivre des règles presque identiques. Par exemple, vous ne pouvez pas modifier le contenu IEnumerable à l'intérieur de la boucle (ce qui est beaucoup plus logique si vous y pensez de la manière STL). Cependant, la boucle for a souvent un objectif logique différent de celui de l'itération.
la source
for(IEnumerator e=collection.GetEnumerator;e.MoveNext();) { ... }
Si la collection en question est un
IList<T>
, vous pouvez simplement utiliserfor
avec l'indexation:Sinon, alors vous pourriez utiliser
Select()
, il a une surcharge qui vous donne l'index.Si cela ne convient pas non plus, je pense que maintenir cet index manuellement est assez simple, ce ne sont que deux très courtes lignes de code. Créer un mot clé spécifiquement pour cela serait une exagération.
la source
foo(++i)
oufoo(i++)
selon l'index nécessaire.Si tout ce que vous savez, c'est que la collection est un IEnumerable, mais que vous devez garder une trace du nombre d'éléments que vous avez traités jusqu'à présent (et donc du total lorsque vous avez terminé), vous pouvez ajouter quelques lignes à une boucle for de base:
Vous pouvez également ajouter une variable d'index incrémentée à une foreach:
Si vous souhaitez rendre ce look plus élégant, vous pouvez définir une ou deux méthodes d'extension pour "masquer" ces détails:
la source
La portée fonctionne également si vous voulez garder le bloc propre des collisions avec d'autres noms ...
la source
Pour cela, j'utilise une
while
boucle. Les boucles avecfor
fonctionnent également, et beaucoup de gens semblent les préférer, mais j'aime seulement les utiliserfor
avec quelque chose qui aura un nombre fixe d'itérations.IEnumerable
s peuvent être générés au moment de l'exécution, donc, à mon avis,while
est plus logique. Appelez cela une directive de codage informelle, si vous le souhaitez.la source