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.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow