2009-10-08 12 views
8

W poniższym przykładzie, w jaki sposób można łatwo przekonwertować eventScores na List<int>, aby można było użyć go jako parametru dla prettyPrint?Jak przekonwertować System.Linq.Enumerable.WhereListIterator <int> na listę <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); } 

Odpowiedz

20

Można by użyć rozszerzenia ToList:

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

pfft , powolny kod! i => (i & 1) == 0 – leppie

+23

Pfft, mikrooptymalizacje nie są prowadzone przez profilowanie. Utworzenie iteratora i kopii na liście będzie setki razy wolniejsze niż jakiekolwiek oszczędności dokonane przez mikrooptymalizację matematyki. * Zoptymalizuj wolne rzeczy. * –

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

nie działa?

1

Przy okazji dlaczego deklarują prettyprint tak określonego typu parametru zdobywa i niż używać tego parametru tylko jako IEnumerable (zakładam to, w jaki sposób realizowane ForEach extension method)? Dlaczego więc nie zmienić podpisu prettyPrint i nie oceniać tego leniwego? =)

Jak to:

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:

Albo można uniknąć stosując List.ForEach tak (nie uwzględnia konkatenacji nieefektywności):

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

Może dlatego, że 'ForEach' jest wbudowaną metodą w klasie' List '. Będziesz musiał napisać własną metodę rozszerzenia, aby użyć 'ForEach' z' IEnumerable '. – LukeH

Powiązane problemy