这些枚举代码在功能上是否相同?

时间:2011-02-10 00:10:40

标签: c# .net linq ienumerable

foreach ( Effect effect in this.Effects.Where ( e => e.IsTransparentEffect && e.HasGPUSupport ) )
    yield return new RealtimeEffect<TransparentEffect> ( effect );

VS

this.Effects.Where ( e => e.IsTransparentEffect && e.HasGPUSupport )
        .Select ( e => new RealtimeEffect<TransparentEffect> ( e ) );

我不知何故认为Select会尝试收集结果而不仅仅是像#1那样产生它?

还会有任何性能差异吗?

2 个答案:

答案 0 :(得分:2)

它在功能上绝对相同(尽管我假设您的LINQ示例中缺少new关键字是一个错字。)

Select中有一些空值检查,但这不太可能显着影响性能。

Jon Skeet在他的博客上写了一篇很好的文章:http://msmvps.com/blogs/jon_skeet/archive/2010/12/23/reimplementing-linq-to-objects-part-3-quot-select-quot-and-a-rename.aspx

答案 1 :(得分:1)

两个代码都会返回相同的结果。两者都有延迟执行(即在你开始枚举结果之前什么都不会执行)并流式传输结果(即没有缓冲)。两个版本之间不应存在显着的性能差异