Linq ha un metodo Select , che prende un Func<TIn, TOut> e lo mappa su un iterabile.
Sto cercando di trovare un buon nome per un metodo che prende un Action <TIn> , lo trasforma per restituire il suo argomento e mappa quello su un iterabile.
Il metodo è
public static IEnumerable<T> MyMap<T>(this IEnumerable<T> source, Action<T> action)
{
return source.Select(i => {action(i); return i;});
}
L'uso iniziale di questo sarebbe eventi vincolanti sugli oggetti:
Controls.AddRange(Enumerable.Range(1, 10).Select(n => new Button(){Text = n.ToString()}).MyMap(b => b.Click += NumberButton_Click).ToArray());
In C # 6, questo è ridondante poiché gli inizializzatori di oggetti possono associare eventi, ma sono bloccato in 5 (dove non è valido farlo) per il futuro prevedibile per ragioni aziendali.
Sono a conoscenza di List.ForEach , ma questo è un metodo void , voglio qualcosa che posso concatenare, come visto sopra.
Modifica: l'esempio di Button era solo un esempio di come lo userei.
Il codice in cui verrebbe usato è più vicino a
private void DoStuff(IEnumerable<Foo> foos)
{
var fooList = foos.ToList();
foreach (var foo in fooList)
{
Foo localFoo = foo;
localFoo.ValueChanged += (sender, e) =>
{
var newArgs = new FooBarEventArgs(localFoo.Bar, e.Baz);
this.OnFooBar(newArgs)
};
}
_wrappedClass.DoStuff(fooList);
}
Quindi non ho il controllo sulla creazione di IEnumerable , e non c'è un singolo elemento equivalente a DoStuff . Tuttavia, con MyMap , diventa un pulitore (IMHO):
private void DoStuff(IEnumerable<Foo> foos)
{
_wrappedClass.DoStuff(foos.MyMap(f => f.ValueChanged += (sender, e) => this.OnFooBar(new FooBarEventArgs(f.Bar, e.Baz)));
}