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.
fonte
2011-12-08 21:35:19
è necessario effettuare un delegato – MethodMan
@DJKRAZE È già un delegato. –
Ho pubblicato il mio esempio di delegato di seguito per utilizzare l'elenco. ForEach – MethodMan