如何将System.Linq.Enumerable.WhereListIterator<int>转换为List<int>?

18
在下面的示例中,我如何轻松将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个回答

35

您可以使用ToList扩展方法:

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

28
微观优化不受性能分析的驱动。创建迭代器和复制到列表中的操作会比微观优化带来的任何收益慢上数百倍。应该优化那些速度较慢的部分。请注意不改变原意。 - Eric Lippert
@Eric Lippert - 我知道这个问题和你的评论已经超过10年了...但是...问题:你当时想说什么?Pete OHanlon的回答似乎很合理。你不同意吗?你有其他建议吗? - FoggyDay
1
@FoggyDay:正如我祖母所说的那样:在曾经有一个红色谷仓的拐角处向左转。我的评论是在回应已删除的评论。现在,你的评论正在回应一个已删除评论的评论,而我的评论正在回应一个评论,该评论正在评论一个已删除的评论。所有这些评论都应该被删除。 - Eric Lippert
2
@FoggyDay:通过我的回应,我们可以重建被删除评论内容。很可能有人建议将 i % 2 == 0 替换为 i & 0x1 == 0。现在,的确,在 x86 上实现模操作的 DIV 指令比 AND 操作要引入几个额外的 CPU 纳秒延迟。但是,JIT 的作者们知道这个事实!要使其成为性能优化,则需要知道 (1) JIT 做得不好,(2) 节省这些纳秒延迟是程序中最慢的部分,以及 (3) 程序已经不可接受地缓慢了。 - Eric Lippert
只是想确认您并没有批评Pete OHanlon的回答,很高兴这不是事实。关于Red Barn - 我有点惊讶,否则成熟的成年人会浪费时间或脑细胞争论i % 2 == 0i & 0x1 == 0的相对效率;) - FoggyDay

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

无效?


3

顺便问一下,为什么你在声明prettyPrint时为scores参数使用了如此具体的类型,而后只将该参数用作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);

2
可能是因为ForEachList<T>类上的内置方法。您需要编写自己的扩展方法才能在IEnumerable<T>中使用ForEach - LukeH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接