2010-03-17 10 views
5

Existe-t-il un moyen d'appeler une méthode/des lignes de code plusieurs fois sans utiliser une boucle for/foreach/while?Boucler une méthode sans for/foreach/while

Par exemple, si je devais utiliser pour boucle:

int numberOfIterations = 6; 
for(int i = 0; i < numberOfIterations; i++) 
{ 
    DoSomething(); 
    SomeProperty = true; 
} 

Les lignes de code que je vous appelle ne pas utiliser « i » et à mon avis, toute déclaration en boucle se cache ce que je J'essaie de faire. C'est la même chose pour un foreach.

Je me demandais s'il y a une déclaration en boucle je peux utiliser qui ressemble à:

do(6) 
{ 
    DoSomething(); 
    SomeProperty = true; 
} 

Il est vraiment clair que je veux juste d'exécuter ce code 6 fois et il n'y a pas de bruit impliquant instanciation d'index et en ajoutant 1 à une variable arbitraire.

Comme un exercice d'apprentissage j'ai écrit une classe statique et méthode:

Do.Multiple(int iterations, Action action) 

Ce qui fonctionne, mais des scores très fortement à l'échelle prétentieuse et je suis sûr que mes collègues ne seraient pas approuver. Je suis probablement juste être pointilleux et une boucle for est certainement le plus reconnaissable, mais comme un point d'apprentissage, je me demandais s'il existe des alternatives (plus propres). Merci.

(j'ai eu un coup d'oeil à ce fil, mais ce n'est pas tout à fait même) Using IEnumerable without foreach loop

+4

s'en tenir à une boucle for. De cette façon, tout le monde sait ce que c'est. –

+2

Hmmm, vous voulez exécuter le même code 6 fois? Essayez-vous de perdre du temps, ou est-ce que le code exécuté a des effets secondaires? Dans les deux cas, honte à vous. –

+0

Honnêtement, je ne vois pas ce qui n'est pas propre à propos d'une boucle for. –

Répondre

12

En fait, la boucle for ne cache pas ce que vous essayez de faire. Tous ceux qui lisent votre code connaissent déjà les boucles standard for et comprendront instantanément ce que vous faites.

+1

Je suis d'accord à 100% mais je voudrais me débarrasser de 'numberOfIterations' car cela ne le rend pas vraiment plus clair. – ChaosPandion

+0

Je l'ai seulement utilisé comme faisant partie du faux exemple de la question. Mais valide le point – RichK

10

Vous pouvez marquer encore plus fortement sur l'échelle de pré-tension en faisant une méthode d'extension:

public static void Times(this int iterations, Action action) 
{ 
    for (int i = 0; i < iterations; i++) 
    { 
     action(); 
    } 
} 
... 
6.Times(() => { 
    DoSomething(); 
    SomeProperty = true; 
}); 

Mais je serais certainement en tenir à une boucle for. C'est la façon idiomatique et bien reconnue de le faire.

+0

Aime ... il faut trouver une excuse pour l'utiliser un jour :) – slugster

+0

Vraiment sympa. C'est presque tentant: p – RichK

+1

C'est absolument la voie à suivre. Nous en avons fait un standard dans mon équipe. – DRBlaise

0

Que diriez-vous do .... jusqu'à ce que ou si ... puis

Utilisez un compteur dans la boucle et avoir boucle jusqu'à ce que le compteur atteint 6.

Ou un if-then avec un compteur. Si votre valeur est 6, sortez de la boucle. Je ne suis pas un gourou de la programmation, mais si vous avez une action qui doit être faite un certain nombre de fois, il y aurait besoin d'un compteur quelque part, que ce soit une fonction de votre boucle ou si elle a être créé avec un compteur.

2

Pas une boucle en vue

private MethodDelegate MultiMethod(MethodDelegate m, int count) { 
    MethodDelegate a; 
    if (count > 0) { 
    a = m; 
    a += MultiMethod(m, --count); 
    } else { 
    a = delegate { }; 
    } 
    return a; 
} 

et vous obtenez une grande syntaxe pour l'appel!

MultiMethod(action, 99)(); 
Questions connexes