Esiste un modo elegante per ripetere un'azione?

Esiste un modo elegante per ripetere un'azione?

Ti piace?

using System.Linq;

Enumerable.Range(0, 10).ForEach(arg => toRepeat());

Questo eseguirà il tuo metodo 10 volte.

[Modifica]

Sono così abituato ad avere ForEach metodo di estensione su Enumerable, che ho dimenticato che non fa parte di FCL.

public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
{
    foreach (var item in source)
        action(item);
}

Ecco cosa puoi fare senza ForEach metodo di estensione:

Enumerable.Range(0, 10).ToList().ForEach(arg => toRepeat());

[Modifica]

Penso che la soluzione più elegante sia implementare il metodo riutilizzabile:

public static void RepeatAction(int repeatCount, Action action)
{
    for (int i = 0; i < repeatCount; i++)
        action();
}

Utilizzo:

RepeatAction(10, () => { Console.WriteLine("Hello World."); });

Non esiste un modo integrato per farlo.

Il motivo è che C# così com'è cerca di imporre una divisione tra il lato funzionale e quello imperativo del linguaggio. C# semplifica la programmazione funzionale solo quando non produrrà effetti collaterali. In questo modo ottieni metodi di manipolazione della raccolta come Where di LINQ , Select , ecc., ma non ottieni ForEach . 1

In modo simile, quello che stai cercando di fare qui è trovare un modo funzionale per esprimere ciò che è essenzialmente un'azione imperativa. Sebbene C# ti dia gli strumenti per farlo, non cerca di semplificarti le cose, poiché così facendo il tuo codice non è chiaro e non idiomatico.

1 C'è un List<T>.ForEach , ma non un IEnumerable<T>.ForEach . Direi l'esistenza di List<T>.ForEach è un artefatto storico derivante dal fatto che i progettisti del framework non avevano riflettuto su questi problemi all'epoca di .NET 2.0; la necessità di una chiara divisione è emersa solo nella versione 3.0.


Per brevità di una battuta potresti farlo. Non so cosa ne pensi...

Enumerable.Repeat<Action>(() => 
{
    Console.WriteLine("Hello World.");
    this.DoSomeStuff();
}, 10).ToList().ForEach(x => x());