2009-10-08 11 views
8

Nell'esempio riportato di seguito, come posso convertire facilmente in List<int> in modo che possa essere utilizzato come parametro per prettyPrint?Come convertire System.Linq.Enumerable.WhereListIterator <int> in Elenco <int>?

Console.WriteLine("Example of LINQ's Where:"); 
List<int> scores = new List<int> { 1,2,3,4,5,6,7,8 }; 
var evenScores = scores.Where(i => i % 2 == 0); 

Action<List<int>, string> prettyPrint = (list, title) => 
    { 
     Console.WriteLine("*** {0} ***", title); 
     list.ForEach(i => Console.WriteLine(i)); 
    }; 

scores.ForEach(i => Console.WriteLine(i)); 
prettyPrint(scores, "The Scores:"); 
foreach (int score in evenScores) { Console.WriteLine(score); } 

risposta

20

devi usare l'estensione ToList:

var evenScores = scores.Where(i => i % 2 == 0).ToList(); 
+5

Pfft , codice lento! i => (i & 1) == 0 – leppie

+23

Pfft, micro-ottimizzazioni non guidate dalla profilazione. La creazione dell'iteratore e la copia nell'elenco saranno centinaia di volte più lenti di qualsiasi risparmio ottenuto grazie alla micro-ottimizzazione della matematica. * Ottimizza le cose lente. * –

9
var evenScores = scores.Where(i => i % 2 == 0).ToList(); 

non funziona?

1

A proposito perché si dichiara prettyPrint con tale tipo specifico per il parametro punteggi e di utilizzare questo parametro solo come IEnumerable (presumo questo è come è stato implementato Per ogni metodo di estensione? Quindi, perché non cambiare la firma prettyPrint e mantenere questo pigro valutato? =)

Ti piace questa:

Action<IEnumerable<int>, string> prettyPrint = (list, title) => 
{ 
    Console.WriteLine("*** {0} ***", title); 
    list.ForEach(i => Console.WriteLine(i)); 
}; 

prettyPrint(scores.Where(i => i % 2 == 0), "Title"); 

Aggiornamento:

Oppure si può evitare di usare List.ForEach come questo (non prendere in considerazione la concatenazione di stringhe inefficienza):

var text = scores.Where(i => i % 2 == 0).Aggregate("Title", (text, score) => text + Environment.NewLine + score); 
+1

Forse perché 'ForEach' è un metodo incorporato nella classe' List '. Dovresti scrivere il tuo metodo di estensione per usare 'ForEach' con' IEnumerable '. – LukeH