我在一个我以前从未见过的旧项目中遇到过一些代码,让我对它的意图感到困惑。
updatables.Select(r =>
{
// some operations are done here for each element in the list
return true;
}).ToArray();
似乎正在使用select语句来迭代updatables集合。 ToArray
调用似乎也没有做任何事情。
我的问题是,如果有的话,Select
语句中的调用return true会完成什么?
答案 0 :(得分:3)
这看起来非常像模仿ForEach
的黑客:
ToArray()
来确保updatables
将迭代完成,return true
以使不允许Action<T>
的编译器静音,但在LINQ Func<T,bool>
中允许Select
。我强烈建议不要编写这样的代码,因为它的可读性远低于等效的foreach
循环。
答案 1 :(得分:1)
Select
需要Func<T, TResult>
- 这意味着它不会接受Action<T>
。换句话说,一个不返回任何内容的lambda在传递给Select
时会导致编译错误,因此作者绕过了#34;限制&#34;让它返回一个虚拟值。
此代码背后的意图可能是使用LINQ语法在集合上运行foreach
循环。但是,它在这段代码中完成的方式是一种不好的做法,因为LINQ方法应该是纯粹的 - 也就是说,不要修改表达式之外的任何类型的状态。