2009-10-08 6 views
8

Im folgenden Beispiel, wie kann ich einfach eventScores zu List<int> konvertieren, so dass ich es als Parameter für prettyPrint verwenden kann?Wie konvertiert man System.Linq.Enumerable.WhereListIterator <int> in die Liste <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); } 

Antwort

20

Sie würden die ToList Erweiterung verwenden:

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

Pfft , langsamer Code! i => (i & 1) == 0 – leppie

+23

Pfft, Mikro-Optimierungen nicht durch Profiling gefahren. Die Erstellung des Iterators und die Kopie in die Liste werden Hunderte von Malen langsamer sein als alle Einsparungen, die durch Mikrooptimierung der Mathematik erzielt werden. * Optimiere das langsame Zeug. * –

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

funktioniert nicht?

1

Durch die Art und Weise, warum haben Sie Schön mit einer solchen speziellen Typ für Partituren Parameter und als mit diesem Parameter nur als IEnumerable erklären (ich nehme an, das ist, wie Sie implementiert Für jede Erweiterungsmethode)? Warum also nicht die prettyPrint-Signatur ändern und diese faul bewerten lassen? =)

So:

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

Update:

Oder Sie können mit List.ForEach wie folgt aus (nehmen Sie vermeiden nicht berücksichtigt String-Verkettung Ineffizienz):

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

Vielleicht, weil 'ForEach' eine eingebaute Methode in der' List ' Klasse ist. Sie müssten Ihre eigene Erweiterungsmethode schreiben, um 'ForEach' mit' IEnumerable 'zu verwenden. – LukeH