是。选择<t>(...)之前是首选。哪里<t>(...)?</t> </t>

时间:2013-01-17 10:35:56

标签: c# linq iterator

我与两位同事讨论了关于 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 会更快,因为我们不会创建任何额外的实例。

谁是对的?

2 个答案:

答案 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()将为列表中的每个项运行一个函数,返回函数的结果,而不进行任何过滤。