.NET Framework
ForEach
Zoeken…
Opmerkingen
Gebruik je het helemaal?
Je zou kunnen stellen dat de bedoeling van het .NET-framework is dat vragen geen bijwerkingen hebben en dat de ForEach
methode per definitie een bijwerking veroorzaakt. Mogelijk vindt u uw code beter onderhoudbaar en gemakkelijker te testen als u in plaats daarvan een gewone foreach
gebruikt.
Een methode aanroepen voor een object in een lijst
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());
Uitbreidingsmethode voor IEnumerable
ForEach()
is gedefinieerd in de klasse List<T>
, maar niet op IQueryable<T>
of IEnumerable<T>
. U hebt in die gevallen twee keuzes:
Eerst aan lijst
De opsomming (of query) wordt geëvalueerd, waarbij de resultaten naar een nieuwe lijst worden gekopieerd of de database wordt opgeroepen. De methode wordt vervolgens voor elk item aangeroepen.
IEnumerable<Customer> customers = new List<Customer>();
customers.ToList().ForEach(c => c.SendEmail());
Deze methode heeft overduidelijk geheugengebruik, omdat er een tussentijdse lijst wordt gemaakt.
Extensie methode
Schrijf een uitbreidingsmethode:
public static void ForEach<T>(this IEnumerable<T> enumeration, Action<T> action)
{
foreach(T item in enumeration)
{
action(item);
}
}
Gebruik:
IEnumerable<Customer> customers = new List<Customer>();
customers.ForEach(c => c.SendEmail());
Let op: De LINQ-methoden van het Framework zijn ontworpen met de bedoeling puur te zijn , wat betekent dat ze geen bijwerkingen veroorzaken. Het enige doel van de ForEach
methode is het produceren van bijwerkingen en wijkt in dit opzicht af van de andere methoden. U kunt overwegen in plaats daarvan gewoon een gewone foreach
lus te gebruiken.