.NET Framework
Для каждого
Поиск…
замечания
Использовать его вообще?
Вы можете утверждать, что намерение платформы .NET состоит в том, что запросы не имеют побочных эффектов, а метод ForEach
по определению вызывает побочный эффект. Вы можете обнаружить, что ваш код более удобен в обслуживании и проще тестировать, если вместо этого вы используете простой foreach
.
Вызов метода для объекта в списке
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());
Метод расширения для IEnumerable
ForEach()
определяется в классе List<T>
, но не в IQueryable<T>
или IEnumerable<T>
. В этих случаях у вас есть два варианта:
ToList первый
Нумерация (или запрос) будет оцениваться, копирование результатов в новый список или вызов базы данных. Затем этот метод вызывается для каждого элемента.
IEnumerable<Customer> customers = new List<Customer>();
customers.ToList().ForEach(c => c.SendEmail());
Этот метод имеет очевидные издержки использования памяти, поскольку создается промежуточный список.
Метод расширения
Напишите метод расширения:
public static void ForEach<T>(this IEnumerable<T> enumeration, Action<T> action)
{
foreach(T item in enumeration)
{
action(item);
}
}
Использование:
IEnumerable<Customer> customers = new List<Customer>();
customers.ForEach(c => c.SendEmail());
Внимание: методы LINQ Framework разработаны с целью быть чистыми , что означает, что они не производят побочных эффектов. Единственной целью метода ForEach
является создание побочных эффектов и отклонение от других методов в этом аспекте. Вместо этого вы можете просто использовать простой цикл foreach
.