Szukaj…


Uwagi

W ogóle go użyć?

Można argumentować, że intencją frameworka .NET jest to, że zapytania nie mają żadnych skutków ubocznych, a metoda ForEach z definicji powoduje efekt uboczny. Kod może być łatwiejszy w utrzymaniu i łatwiejszy do przetestowania, jeśli zamiast tego użyjesz zwykłego foreach .

Wywołanie metody na obiekcie na liście

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());

Metoda rozszerzenia dla IEnumerable

ForEach() jest zdefiniowany w klasie List<T> , ale nie w IQueryable<T> lub IEnumerable<T> . W tych przypadkach masz dwie możliwości:

Najpierw lista

Wyliczenie (lub zapytanie) zostanie ocenione, kopiując wyniki na nową listę lub wywołując bazę danych. Metoda jest następnie wywoływana dla każdego elementu.

IEnumerable<Customer> customers = new List<Customer>();

customers.ToList().ForEach(c => c.SendEmail());

Ta metoda ma oczywisty narzut wykorzystania pamięci, ponieważ tworzona jest lista pośrednia.

Metoda przedłużenia

Napisz metodę rozszerzenia:

public static void ForEach<T>(this IEnumerable<T> enumeration, Action<T> action)
{
    foreach(T item in enumeration)
    {
        action(item);
    }
}

Posługiwać się:

IEnumerable<Customer> customers = new List<Customer>();

customers.ForEach(c => c.SendEmail());

Uwaga: metody LINQ w Framework zostały zaprojektowane z myślą o zachowaniu czystości , co oznacza, że nie powodują skutków ubocznych. Jedynym celem metody ForEach jest wywołanie skutków ubocznych i różni się od innych metod w tym aspekcie. Zamiast tego możesz rozważyć użycie zwykłej pętli foreach .



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow