LINQ select的可能目的(x => x)

我正在阅读一本关于MVC的书中的LINQ示例,我想知道下面的选择调用有什么用途。 也许这是一个错字,但我在书的勘误表中没有看到任何提及。

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

我测试了两个这样的例子,其中包括.Select(e => e)和一个不包含的内容,代码是相同的。 由于Where返回由谓词过滤的IEnumerable,那么何时需要select调用(具有上面的特定谓词)? 它真的做了什么吗? 它可以在一些奇怪的角落里吗?

如果没有它,它将返回完全相同的东西,一个IEnumerable 。 它实际上弊大于利,因为它正在执行冗余的O(n)操作(循环遍历整个列表)。

参考

  • MSDN – Enumerable.Select
  • MSDN – Enumerable.Where

它真的做了什么吗?

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

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

虽然一般来说,拥有一个身份选择调用并不总是坏事,特别是如果在函数中返回查询。 这有助于为您提供要返回的集合的只读视图。 但是这不适用于这种情况,因为查询是立即枚举的。