我与两位同事讨论了关于 IEnumerable 的迭代设置(其内容在操作期间不会以任何方式改变)。有三种相互矛盾的理论,即最优方法。其他人(以及我)都非常肯定,这让我不确定,所以为了清楚起见,我想检查外部来源。
方案如下。我们将下面的代码作为起点,并发现某些 hazaas 无需采取行动。因此,从下面的代码开始,我们开始为操作添加阻止程序。
foreach(Hazaa hazaa in hazaas) ;
我的建议如下。
foreach(Hazaa hazaa in hazaas.Where(element => condition)) ;
其中一个人希望以更明确的形式解决它,声称LINQ在这种情况下不合适(不确定为什么它会如此,但他似乎非常有信心)。他的解决方案就是这个。
foreach(Hazaa hazaa in hazaas) ;
if(condition) ;
另一个反对意见得到了声明支持 Where 不必要地重复过滤过程的风险,并且通过选择的
foreach(Hazaa hazaa in hazaas.Select(element => condition)) ;
我认为第一个是过时的,因为LINQ可以很好地处理数据对象。
我也相信选择 -ing在这种情况下等同于 Where -ing,并且不会采取任何不必要的步骤(例如评估条件元素只会执行一次)。如果有的话,使用 Where 会更快,因为我们不会创建任何额外的实例。
谁是对的?
答案 0 :(得分:10)
Select
不合适。它不会过滤任何东西
if
是一种可能的解决方案,但Where
同样明确。
Where
每个项目只执行一次条件,就像if
一样。此外,请务必注意,对Where
的调用不会迭代列表。因此,使用Where
只需对列表进行一次迭代,就像使用if
时一样。
我认为你正在和一个不理解LINQ的人讨论 - 那个想要使用Select
的人 - 以及一个不喜欢LINQ功能方面的人。
我会选择Where
。
答案 1 :(得分:1)
.Where()
和if(condition)
方法将是相同的
但是由于LinQ很可读,我更喜欢它。
使用.Select()
的方法是无稽之谈,因为它不会返回Hazaa-Object,而是IEnumerable<Boolean>
要明确这些功能:
myEnumerable.Where(a => isTrueFor(a)) //This is filtering
myEnumerable.Select(a => a.b) //This is projection
Where()
将运行一个函数,它返回一个可枚举的布尔foreach项,并根据布尔函数的结果返回该项
Select()
将为列表中的每个项运行一个函数,返回函数的结果,而不进行任何过滤。