2014-09-03 52 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