2011-12-08 23 views
5

domanda veloce, Vedere questo codice:Foreach con Metodo di estensione sul IEnumerable

List<int> result = new List<int>(); 

var list = new List<int> { 1, 2, 3, 4 }; 

list.Select(value => 
    { 
     result.Add(value);//Does not work?? 
     return value; 
    }); 

E:

result.Count == 0 //true 

Perché result.Add (valore) non eseguita?

Tuttavia questo non eseguito, Un'altra domanda che è avere un modo fare un foreach su un IEnumerable con Extention Metodo?

Tranne questo modo: IEnumerable.ToList().Foreach(p=>...)

+0

è necessario effettuare un delegato – MethodMan

+1

@DJKRAZE È già un delegato. –

+0

Ho pubblicato il mio esempio di delegato di seguito per utilizzare l'elenco. ForEach – MethodMan

risposta

17

Perché result.Add (valore) non eseguita?

Questo perché LINQ utilizza l'esecuzione posticipata. Finché non si enumerano effettivamente i risultati (il rendimento di Select), i delegati non verranno eseguiti.

Per dimostrare, provare quanto segue:

List<int> result = new List<int>(); 

var list = new List<int> { 1, 2, 3, 4 }; 

var results = list.Select(value => 
    { 
     result.Add(value);//Does not work?? 
     return value; 
    }); 

foreach(var item in results) 
{ 
    // Just iterating through this will cause the above to execute... 
} 

Detto questo, questo è un cattiva idea. Le query LINQ non dovrebbero avere effetti collaterali se puoi evitarlo. Pensa a Select come un modo per trasformare i tuoi dati, non eseguire codice.

Tuttavia questo non eseguito, Un'altra domanda che è un modo di fare un foreach su un IEnumerable con Extention Method?

Si potrebbe scrivere il proprio metodo di estensione:

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

Tuttavia, mi sento di raccomandare non fare questo. Per dettagli, fare riferimento a Eric Lippert's post on the subject.

+0

Grazie per le vostre risposte, la vostra descrizione risolto il mio confusione di comprendere I Esecuzione enumerabile e differita. –

3

Select è pigro e l'esecuzione viene posticipata finché non si avvia l'enumerazione sui risultati. È necessario consumare il gruppo di risultati chiamando .ToArray per esempio o loop sul risultato:

list.Select(value => 
    { 
     result.Add(value);//Does not work?? 
     return value; 
    }).ToArray(); 
+0

Se avessi intenzione di usare un metodo solo per forzare l'enumerazione, userei uno con memoria costante come 'Max()' piuttosto che 'ToArray()'. –

-1
List<int> result = new List<int>(); 
var list = new List<int> { 1, 2, 3, 4 }; 
list.ForEach(delegate(int sValue) 
{ 
    result.Add(sValue); 
}); 

questo funziona, ma tutti e aggiunge 1 2 3 4 nel risultato. Provalo. L'ho appena fatto.

+0

Ho menzionato: Tranne questo modo: IEnumerable.ToList(). Foreach (p => ...) –

Problemi correlati