2010-07-07 12 views
21

C'è un modo per chiamare un metodo su ogni oggetto in un elenco - ad es.Generics - chiama un metodo su ogni oggetto in un elenco <T>

Invece di

List<MyClass> items = setup(); 

foreach (MyClass item in items) 
    item.SomeMethod(); 

Si potrebbe fare qualcosa di simile

foreach(items).SomeMethod(); 

Tutto integrato, metodi di estensione, o sto solo di essere troppo dannatamente pigro?

risposta

41

Sì, il List<T>, si trova:

items.ForEach(item => item.SomeMethod()) 

La stranezza è che questo è disponibile solo su List<T>, non IList<T> o IEnumerable<T>

Per risolvere questo problema, mi piace aggiungere il seguente metodo di estensione:

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

Quindi, puoi usarlo su TUTTO ciò che implementa IEnumerable<T> ... non solo List<T>

+0

Come mi sono perso. Per ogni ... riassume la mia giornata di oggi! Bel metodo di estensione. – Ryan

15
items.ForEach(i => i.SomeMethod()); 
+0

È nuovo in 4.0? –

+1

@Rosarch: No. http://msdn.microsoft.com/en-us/library/bwabdf9z.aspx nota che coderush suggerirà questo come una modifica da foreach (var x in items) x.SomeMethod(); –

+0

@Brian Genisio ya penso che ho notato/risolto quello allo stesso tempo del tuo commento ... –

4

Le liste hanno un metodo ForEach. È anche possibile creare un metodo di estensione IEnumerable, but it kind of goes against the spirit of Linq.

+0

Naturalmente, come ha dimostrato uno dei commentatori di quel post, a volte non esiste un sostituto (ordinato) per ForEach. Tuttavia, se è solo per chiamare uno o due metodi su _every_ oggetto in un contenitore, utilizzare foreach classico è davvero la strada da percorrere. –

1

Se è necessario modificare una proprietà su MyClass utilizzando MyMethod, utilizzare il metodo 'tubo' da Jon Skeet di morelinq library

items = items.Pipe<MyClass>(i => i.Text = i.UpdateText()).ToList() 

Le possibilità sono infinite! :)

Problemi correlati