Как преобразовать System.Linq.Enumerable.WhereListIterator <int>в список <int>? - PullRequest
12 голосов
/ 08 октября 2009

В приведенном ниже примере, как я могу легко преобразовать eventScores в List<int>, чтобы использовать его в качестве параметра для prettyPrint?

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

Ответы [ 3 ]

23 голосов
/ 08 октября 2009

Вы бы использовали расширение ToList:

var evenScores = scores.Where(i => i % 2 == 0).ToList();
9 голосов
/ 08 октября 2009
var evenScores = scores.Where(i => i % 2 == 0).ToList();

не работает?

1 голос
/ 08 октября 2009

Кстати, почему вы объявляете prettyPrint с таким конкретным типом для параметра показателей, а затем используете этот параметр только как IEnumerable (я предполагаю, что именно так вы реализовали метод расширения ForEach)? Так почему бы не поменять подпись prettyPrint и не оставлять это ленивым? =) * * Тысяча одна

Как это:

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

Обновление:

Или вы можете избежать использования List.ForEach следующим образом (не принимать во внимание неэффективность конкатенации строк):

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