C# 在LINQ Select语句中调用返回true
我在一个以前从未见过的老项目中遇到了一些代码,这让我对它的意图感到困惑C# 在LINQ Select语句中调用返回true,c#,linq,C#,Linq,我在一个以前从未见过的老项目中遇到了一些代码,这让我对它的意图感到困惑 updatables.Select(r => { // some operations are done here for each element in the list return true; }).ToArray(); 似乎正在使用select语句来迭代Updateables集合。似乎ToArray的调用也没有做任何事情 我的问题是,Select语句中的调用返回true有什么作用呢?这看起来很像是
updatables.Select(r =>
{
// some operations are done here for each element in the list
return true;
}).ToArray();
似乎正在使用select语句来迭代Updateables集合。似乎ToArray的调用也没有做任何事情
我的问题是,Select
语句中的调用返回true有什么作用呢?这看起来很像是模仿ForEach
:
- 添加了
ToArray()
调用,以确保可更新文件将被迭代完成
- 添加了
返回true
以使编译器静音,该编译器不允许操作
,但允许在LINQ的选择中使用Func
我强烈建议不要编写这样的代码,因为它的可读性远远低于等价的foreach
循环。Select
采用Func
——这意味着它不会接受操作。换句话说,不返回任何内容的lambda在传递到Select
时将导致编译错误,因此作者通过让它返回一个伪值绕过了该“限制”
此代码背后的意图可能是使用LINQ语法在集合上运行foreach
循环。但是,在这段代码中执行的方式是一种不好的做法,因为LINQ方法应该是纯的——也就是说,不修改表达式之外的任何类型的状态。对于原始集合中的每个实体,都返回true
。基本上将原始实体投影到布尔值。结果是IEnumerable
。要阵列执行LINQ查询。。。但问题是执行的某些操作将产生副作用,但选择并不是为了这样做……它看起来像是foreach
的一个又快又丑的LINQ版本。这是一个更新?为什么人们认为LINQ比foreach循环快?这里的情况正好相反,创建与updateables
大小相同的新数组是没有明显原因的。或者使用专门为此类任务构建的东西,例如。