0

我与两位同事讨论了IEnumerable上的迭代设置(其内容在操作期间不会以任何方式更改)。存在三种相互矛盾的理论,哪一种是最佳方法。其他人(以及我)都非常确定,这让我不确定,所以为了清楚起见,我想与外部来源核实。

场景如下。我们以下面的代码为起点,发现不需要对某些​​hazaas采取行动。所以,从下面的代码开始,我们开始为动作添加一个拦截器。

foreach(Hazaa hazaa in hazaas) ;

我的建议如下。

foreach(Hazaa hazaa in hazaas.Where(element => condition)) ;

其中一个人想通过更明确的形式解决它,声称 LINQ 在这种情况下不合适(不知道为什么会这样,但他似乎非常确信)。他的解决方案是这样的。

foreach(Hazaa hazaa in hazaas) ;
  if(condition) ;

另一个相反的建议得到了支持,即Where有不必要地重复过滤过程的风险,并且通过Select一次性选择适当的元素可以更确定地最小化计算工作量。

foreach(Hazaa hazaa in hazaas.Select(element => condition)) ;

我认为第一个已经过时了,因为 LINQ 可以很好地处理数据对象。

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

谁是对的?

4

2 回答 2

10

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

我认为您正在与一个不了解 LINQ 的人讨论 - 那个想要使用的人Select- 以及一个不喜欢 LINQ 功能方面的人。

我会去Where

于 2013-01-17T10:40:27.933 回答
1

.Where()和方法将if(condition)是相同的。
但由于 LinQ 可读性很好,我更喜欢这样。

with 的方法.Select()是无稽之谈,因为它不会返回 Hazaa-Object,而是IEnumerable<Boolean>

要明确功能:

myEnumerable.Where(a => isTrueFor(a)) //This is filtering
myEnumerable.Select(a => a.b) //This is projection

Where()将运行一个函数,该函数返回一个布尔 foreach 可枚举项,并根据布尔函数的结果返回该项目
Select()将为列表中的每个项目运行一个函数,并返回函数的结果而不进行任何过滤。

于 2013-01-17T10:45:41.597 回答