2009-10-08 34 views
8

En el siguiente ejemplo, ¿cómo puedo convertir fácilmente eventScores en List<int> para que pueda usarlo como parámetro para prettyPrint?Cómo convertir System.Linq.Enumerable.WhereListIterator <int> en la lista <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); } 

Respuesta

20

tendrá que utilizar la extensión ToList:

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

Pfft , código lento! i => (i & 1) == 0 – leppie

+23

Pfft, micro optimizaciones no controladas por perfiles. La creación del iterador y la copia en la lista serán cientos de veces más lentas que cualquier ahorro hecho al optimizar las matemáticas. * Optimizar las cosas lentas. * –

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

no funciona?

1

Por cierto, ¿por qué se declara prettyprint con tal tipo específico para el parámetro de cuentas y de utilizar este parámetro sólo como IEnumerable (supongo que esta es la forma que ha implementado Para cada método de extensión)? Entonces, ¿por qué no cambiar la firma de prettyPrint y mantener este vago evaluado? =)

De esta manera:

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

Actualización:

O se puede evitar el uso de List.ForEach como esto (no se tiene en cuenta la ineficiencia de concatenación de cadenas):

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

Tal vez porque 'ForEach' es un método incorporado en la clase' List '. Tendría que escribir su propio método de extensión para usar 'ForEach' con' IEnumerable '. – LukeH

Cuestiones relacionadas