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)));
}