9

我正在浏览一本关于 MVC 的书中的一些 LINQ 示例,我想知道下面的 select 调用可能有什么目的。也许这是一个错字,但我在书中的勘误表中没有看到任何提及。

foreach( Product p in products
    .Where( e => e.Name == productParam.Name )
    .Select( e => e ) ) {
        p.Price = productParam.Price;
}

我测试了两个包含 .Select( e => e) 的示例,一个不包含且代码相同的示例。由于 Where 返回由谓词过滤的 IEnumerable,那么何时需要选择调用(使用上面的特定谓词)?它真的有什么作用吗?可以在一些奇怪的角落案例中吗?

4

3 回答 3

11

它将返回与没有它完全相同的东西,即IEnumerable<T>. 它实际上弊大于利,因为它执行了冗余的 O(n) 操作(循环整个列表)。

参考

于 2013-03-31T17:49:54.013 回答
6

它真的有什么作用吗?

它确实增加了整个操作的开销。实际上,它应该被删除,因为它没有任何用处。

于 2013-03-31T17:50:35.453 回答
3

我认为作者只是想展示 LINQ 查询与 SQL 语句非常相似。在这种情况下,显然不需要它,因为它使用身份函数并且可以省略。但是,必须select在 SQL 中包含该子句。把它放在那里没有错,但绝对不需要。

虽然一般来说,进行身份选择调用并不总是一件坏事,尤其是在函数中返回查询时。这有助于为您提供要返回的集合的只读视图。但这不适用于这种情况,因为查询会立即被枚举。

于 2013-03-31T17:55:50.863 回答