.NET Framework
Per ciascuno
Ricerca…
Osservazioni
Usalo affatto?
Si potrebbe obiettare che l'intenzione del framework .NET è che le query non abbiano effetti collaterali e che il metodo ForEach
sia per definizione causa di un effetto collaterale. Potresti trovare il tuo codice più manutenibile e più facile da testare se usi una foreach
normale.
Chiamare un metodo su un oggetto in un elenco
public class Customer {
public void SendEmail()
{
// Sending email code here
}
}
List<Customer> customers = new List<Customer>();
customers.Add(new Customer());
customers.Add(new Customer());
customers.ForEach(c => c.SendEmail());
Metodo di estensione per IEnumerable
ForEach()
è definito nella classe List<T>
, ma non su IQueryable<T>
o IEnumerable<T>
. Hai due scelte in questi casi:
Per prima cosa
L'enumerazione (o la query) sarà valutata, copiando i risultati in un nuovo elenco o chiamando il database. Il metodo viene quindi chiamato su ciascun elemento.
IEnumerable<Customer> customers = new List<Customer>();
customers.ToList().ForEach(c => c.SendEmail());
Questo metodo ha un overhead di utilizzo della memoria evidente, in quanto viene creato un elenco intermedio.
Metodo di estensione
Scrivi un metodo di estensione:
public static void ForEach<T>(this IEnumerable<T> enumeration, Action<T> action)
{
foreach(T item in enumeration)
{
action(item);
}
}
Uso:
IEnumerable<Customer> customers = new List<Customer>();
customers.ForEach(c => c.SendEmail());
Attenzione: i metodi LINQ del Framework sono stati progettati con l'intento di essere puri , il che significa che non producono effetti collaterali. L'unico scopo del metodo ForEach
è produrre effetti collaterali e devia dagli altri metodi sotto questo aspetto. Si può prendere in considerazione solo l'uso di un ciclo foreach
normale invece.