是.选择<T>(...)之前优先.哪里<T>(...)?

Kon*_*ten 0 c# linq iterator

我与两位同事讨论了关于IEnumerable迭代的设置(其内容在操作期间不会以任何方式改变).有三种相互矛盾的理论,即最优方法.其他人(以及我)都非常肯定,这让我不确定,所以为了清楚起见,我想用外部来源检查.

方案如下.我们将下面的代码作为起点,发现有些hazaas不需要采取行动.因此,从下面的代码开始,我们开始为操作添加阻止程序.

foreach(Hazaa hazaa in hazaas) ;
Run Code Online (Sandbox Code Playgroud)

我的建议如下.

foreach(Hazaa hazaa in hazaas.Where(element => condition)) ;
Run Code Online (Sandbox Code Playgroud)

其中一个人希望通过更明确的形式解决它,声称LINQ在这种情况下不合适(不确定为什么它会如此,但他似乎非常有信心).他的解决方案就是这个.

foreach(Hazaa hazaa in hazaas) ;
  if(condition) ;
Run Code Online (Sandbox Code Playgroud)

其他禁忌建议由要求支持的是在哪里风险毫无必要的,它更某些通过挑选合适的元素一次全部以减少计算工作量重复过滤过程中选择.

foreach(Hazaa hazaa in hazaas.Select(element => condition)) ;
Run Code Online (Sandbox Code Playgroud)

我认为第一个是过时的,因为LINQ可以很好地处理数据对象.

我也相信Select -ing在这种情况下等同于Where -ing并且不会采取任何不必要的步骤(例如,对元素的条件的评估将仅执行一次).如果有的话,使用Where应该更快,因为我们不会创建任何额外的实例.

谁是对的?

Dan*_*rth 10

Select不合适.它不会过滤任何东西.
if是一种可能的解决方案,但Where同样明确. Where每个项目只执行一次条件,就像if.此外,请务必注意,调用Where不会迭代列表.因此,使用Where您只需对列表进行一次迭代,就像使用时一样if.

我想你正在与一个不理解LINQ的人讨论 - 想要使用的人Select- 以及一个不喜欢LINQ功能方面的人.

我会去Where.