2009-10-08 10 views
8

Dans l'exemple ci-dessous, comment puis-je facilement convertir eventScores en List<int> afin que je puisse l'utiliser comme paramètre pour prettyPrint?Comment faire pour convertir System.Linq.Enumerable.WhereListIterator <int> à la 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); } 

Répondre

20

Vous souhaitez utiliser l'extension ToList:

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

Pff , code lent! i => (i & 1) == 0 – leppie

+23

Pfft, micro-optimisations non pilotées par le profilage. La création de l'itérateur et la copie à la liste seront des centaines de fois plus lentes que les économies réalisées en optimisant les mathématiques. * Optimiser les choses lentes. * –

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

ne fonctionne pas?

1

D'ailleurs pourquoi Déclarez-vous prettyPrint avec un tel type spécifique pour le paramètre scores et que d'utiliser ce paramètre uniquement comme IEnumerable (je suppose que c'est la façon dont vous avez implémenté Méthode d'extension ForEach)? Alors pourquoi ne pas changer la signature de prettyPrint et garder ce paresseux évalué? =)

Comme ceci:

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

Mise à jour:

Ou vous pouvez éviter d'utiliser List.ForEach comme ça (ne prennent pas en manque d'efficacité de concaténation de compte):

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

Peut-être parce que 'ForEach' est une méthode intégrée sur la classe' List '. Vous devrez écrire votre propre méthode d'extension pour utiliser 'ForEach' avec' IEnumerable '. – LukeH

Questions connexes