2010-03-17 10 views
5

Czy istnieje sposób wywoływania metody/linii kodu wielokrotnie, nie używając pętli for/foreach/while?Zapętlając metodę bez for/foreach/while

Na przykład, jeśli miałbym użyć do pętli for:

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

liniach kodu Dzwonię nie używać „i” i moim zdaniem cała deklaracja pętli ukrywa co ja” Próbuję to zrobić. To samo dotyczy foreach.

Zastanawiałem się, czy nie jest to zapętlenie oświadczenie mogę użyć, który wygląda mniej więcej tak:

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

To naprawdę jasne, że po prostu chcą wykonać tego kodeksu 6 razy i nie ma hałasu z udziałem indeksu instancji i dodanie 1 do dowolnej arbitralnej zmiennej.

Jako nauka wykonywania Pisałem statyczną klasę i metoda:

Do.Multiple(int iterations, Action action) 

który działa, ale wynikami bardzo wysoko na skali pretensjonalne i jestem pewien, że moi rówieśnicy nie zatwierdzi.

Prawdopodobnie po prostu bycie wybrednym i pętla for jest z pewnością najbardziej rozpoznawalna, ale jako punkt nauki zastanawiałem się, czy istnieją (czystsze) alternatywy. Dzięki.

(miałem spojrzeć na ten wątek, ale nie jest to dość samo) Using IEnumerable without foreach loop

+4

trzymać z pętli for. W ten sposób każdy wie, co to jest. –

+2

Hmmm, chcesz wykonać ten sam kod 6 razy? Czy po prostu starasz się tracić czas, czy wykonywany kod ma efekty uboczne? W każdym razie, wstydź się. –

+0

Szczerze mówiąc nie widzę tego, co nie jest czyste w pętli for. –

Odpowiedz

12

Faktycznie, pętla for nie ukrywa, co próbujesz zrobić.
Każdy, kto czyta twój kod, jest już zaznajomiony ze standardowymi pętlami for i natychmiast zrozumie, co robisz.

+1

Zgadzam się w 100%, ale pozbyłbym się 'NumberOfIterations', ponieważ tak naprawdę nie czyni to jaśniejszym. – ChaosPandion

+0

Użyłem tego tylko jako część fałszywego przykładu w pytaniu. Ale ważny punkt – RichK

10

Można zdobyć nawet silniej na skali pretensja poprzez uczynienie go metodę rozszerzenia:

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

Ale na pewno będę trzymać się for pętli. To idiomatyczny, dobrze rozpoznany sposób robienia tego.

+0

Uwielbiam ... muszę znaleźć wymówkę, by kiedyś tego użyć :) – slugster

+0

Naprawdę ładne. To prawie kuszące: p – RichK

+1

To jest absolutnie droga. Stworzyliśmy standard w moim zespole. – DRBlaise

0

Jak o aż do .... czy ... potem

użyć licznika wewnątrz pętli i mieć go pętlę, aż licznik osiągnie 6.

lub if-then Oświadczenie licznik. Jeśli twoja wartość wynosi 6, wyjdź z pętli.

Nie jestem guru programistycznym, ale jeśli masz działanie, które należy wykonać określoną liczbę razy, potrzebowałoby się gdzieś kontrować, czy to funkcja pętli, czy też do utworzenia z licznikiem.

2

Nie pętla w oczach

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

i masz wielką składnię wywołania!

Powiązane problemy