Поиск…


замечания

Использовать его вообще?

Вы можете утверждать, что намерение платформы .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 .



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow