.NET Framework
För varje
Sök…
Anmärkningar
Använd det alls?
Du kan hävda att avsikten med .NET-ramverket är att frågor inte har några biverkningar och att ForEach
metoden per definition orsakar en bieffekt. Du kanske tycker att din kod är mer underhållbar och lättare att testa om du använder en vanlig foreach
istället.
Ringa en metod på ett objekt i en lista
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());
Förlängningsmetod för IEnumerable
ForEach()
definieras i klassen List<T>
, men inte på IQueryable<T>
eller IEnumerable<T>
. Du har två val i dessa fall:
ToList först
Uppräkningen (eller frågan) kommer att utvärderas, kopiera resultaten till en ny lista eller ringa databasen. Metoden kallas sedan för varje artikel.
IEnumerable<Customer> customers = new List<Customer>();
customers.ToList().ForEach(c => c.SendEmail());
Den här metoden har uppenbar huvuddrag av minnesanvändning eftersom en mellanlista skapas.
Förlängningsmetod
Skriv en förlängningsmetod:
public static void ForEach<T>(this IEnumerable<T> enumeration, Action<T> action)
{
foreach(T item in enumeration)
{
action(item);
}
}
Använda sig av:
IEnumerable<Customer> customers = new List<Customer>();
customers.ForEach(c => c.SendEmail());
Varning: Ramverkets LINQ-metoder har utformats med avsikt att vara rena , vilket innebär att de inte ger biverkningar. ForEach
metodens enda syfte är att producera biverkningar och avviker från de andra metoderna i denna aspekt. Du kan överväga att bara använda en vanlig foreach
loop istället.