2014-09-03 49 views
2

渐近最优化都将需要O(n)(当然,n等于列表的长度)时间来完成,但在第一个例子中,列表将被迭代一次,而在第二个中它将迭代5次。LINQ vs foreach当试图总结

第一种方式:

 foreach (var item in model) 
     { 
      fieldsSum.EnergyObjectCount += item.EnergyObjectCount; 
      fieldsSum.HourlyCapacityUtilization += item.HourlyCapacityUtilization; 
      fieldsSum.InstalledPower += item.InstalledPower; 
      fieldsSum.NumberOfGuarantees += item.NumberOfGuarantees; 
      fieldsSum.ProducedEnergy += item.ProducedEnergy; 
     } 

方式二:

 fieldsSum.EnergyObjectCount = model.Sum(item => item.EnergyObjectCount); 
     fieldsSum.HourlyCapacityUtilization = model.Sum(item => item.HourlyCapacityUtilization); 
     fieldsSum.InstalledPower = model.Sum(item => item.InstalledPower); 
     fieldsSum.NumberOfGuarantees = model.Sum(item => item.NumberOfGuarantees); 
     fieldsSum.ProducedEnergy = model.Sum(item => item.ProducedEnergy); 

1)它是被认为是 '坏' 的做法是使用第二种方式?

2)编译器在生成.exe时是否做了任何优化?

+0

我认为第二个不好的做法是因为你在相同的模型上迭代5次 – Sayse 2014-09-03 13:34:11

+0

这个问题可能是天真的,但它仍然是一个有效的问题。为什么-1?来自我的+1 – 2014-09-03 13:38:12

回答

3

1)使用第二种方式是否被认为是“不好的”做法?

是的,你为什么要遍历一个列表五次,而你可以通过一次迭代实现同样的事情?

2)构建.exe时编译器是否做了任何优化?

没有,因为这里没有什么可以优化的(对于编译器)。至少我看不到任何东西。

+4

对集合进行5次迭代并做1/5的工作并不比每迭代多做5次并且执行1次迭代更昂贵。也就是说,只要被迭代的对象不是非实体化的数据库查询,就会产生副作用等等。 – Servy 2014-09-03 13:51:12

+0

@Servy你是_assuming._我们如何测试它? http://ideone.com/wBMk38 – 2014-09-03 14:21:28

+2

这是一个迭代对象推迟执行的例子,这是导致这里有意义的区别的主要案例。当枚举对象不推迟执行时,不会发生。在查询中抛出一个'ToList',你会看到可比较的时间。这并不是说基准缺陷,比如没有升温代码,只做一次测试等等。 – Servy 2014-09-03 14:28:21