2010-03-17 1 views
5

C'è un modo di chiamare un metodo/linee di codice più volte senza usare un ciclo for/foreach/while?Ciclo continuo attraverso un metodo senza for/foreach/while

Per esempio, se dovessi usare per ciclo for:

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

Le righe di codice che sto chiamando non uso 'i' e, a mio parere nella dichiarazione ciclo nasconde quello che ho' sto cercando di fare. Questo è lo stesso per un foreach.

Mi chiedevo se c'è una dichiarazione looping posso usare che sembra qualcosa di simile:

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

E 'davvero chiaro che voglio solo per eseguire il codice 6 volte e non c'è nessun rumore che coinvolge indice di creare un'istanza e l'aggiunta di 1 a qualche variabile arbitraria.

Come un esercizio di apprendimento ho scritto una classe statica e il metodo:

Do.Multiple(int iterations, Action action) 

Che funziona, ma punteggi molto fortemente sulla scala pretenzioso e sono sicuro che i miei coetanei non approverebbe.

Probabilmente sono solo pignolo e un ciclo for è certamente il più riconoscibile, ma come punto di apprendimento mi stavo chiedendo se ci fossero alternative (più pulite). Grazie.

(ho avuto uno sguardo a questa discussione, ma non è del tutto stesso) Using IEnumerable without foreach loop

+4

bastone con un ciclo for. In questo modo tutti sanno di cosa si tratta. –

+2

Hmmm, vuoi eseguire lo stesso codice 6 volte? Stai solo cercando di perdere tempo, o il codice eseguito ha effetti collaterali? In entrambi i casi, vergognati. –

+0

Onestamente non riesco a vedere cosa non è pulito su un ciclo for. –

risposta

12

In realtà, il ciclo for non nasconde quello che stai cercando di fare.
Chi legge il codice ha già familiarità con i loop standard for e capirà immediatamente cosa stai facendo.

+1

Sono d'accordo al 100%, ma mi libererei di 'numberOfIterations' perché in realtà non lo rende più chiaro. – ChaosPandion

+0

L'ho usato solo come parte dell'esempio falso nella domanda. Ma valido punto – RichK

10

Si potrebbe segnare ancora più elevata sulla scala pretensione rendendolo un metodo di estensione:

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

Ma mi sarebbe sicuramente bastone con un ciclo for. È il modo idiomatico e ben riconosciuto di farlo.

+0

Love it ... devo trovare una scusa per usarlo prima o poi :) – slugster

+0

Davvero carino. È quasi allettante: p – RichK

+1

Questa è assolutamente la strada da percorrere. Lo abbiamo reso uno standard nella mia squadra. – DRBlaise

0

Come su un do .... fino a quando o se ... allora

utilizzare un contatore all'interno del ciclo e lo hanno ciclo fino a quando il contatore raggiunge il 6.

o un'istruzione if-then con un contatore. Se il tuo valore è 6, interrompi il ciclo.

Io non sono un guru di programmazione, ma se hai un'azione che deve essere eseguita un certo numero di volte, ci sarà bisogno di un contatore da qualche parte, sia che si tratti di una funzione del tuo ciclo o se ha essere creato con un contatore.

2

Non un ciclo in vista

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

e si ottiene una grande sintassi per l'invocazione!

MultiMethod(action, 99)();