2017-03-07 168 views
2

這是「更好」,更快,更容易閱讀:嵌套Linq比foreach循環更快嗎?

var viewsOnSheet = templateSheet.GetAllViewports() 
    .Select(x => doc.GetElement(x)) 
    .Cast<Viewport>() 
    .Select(x => doc.GetElement(x.ViewId)) 
    .Cast<View>(); 

...比這

foreach (ElementId id in templateSheet.GetAllViewports()) 
{ 
    Viewport vp = doc.GetElement(id) as Viewport; 
    View v = doc.GetElement(vp.ViewId) as View; 
} 

他們都工作,我只是好奇,如果有一些編程標準,我會被這麼多嵌套的Linq調用違反。什麼更容易理解?我個人傾向於foreach循環。

謝謝!

+0

嗯,在這種情況下,我不會使用'as' - 如果類型錯誤,您寧願有一個描述性的'InvalidCastException'或一個'NullReferenceException',它不會告訴您這個元素是否實際上是null或對錯誤類型的非空引用?我可能會使用LINQ,但將演員直接放入「Select」調用中,而不是調用「Cast」。 –

+0

因此而不是'.Select(x => doc.GetElement(x))''你會說'去選擇(x =>(視口)doc.GetElement(x))'? – konrad

+0

是的,我會的。但這實際上是一個基於意見的問題。 –

回答

3

對於Linq-to-objects,代碼爲foreach總是稍微快於等效的LINQ調用,因爲在幾次方法調用之後,LINQ的末尾會出現類似的foreach。對於少量函數調用的Linq-to-SQL/Linq-to-XML等效代碼,僅僅因爲執行的代碼少就會更快。

請注意,更復雜的LINQ表達式的正確匹配代碼可能不容易編寫(嘗試自己正確書寫GroupBy),絕對不會比LINQ短。

對於您的應用程序來說,這種表現是否有不同的問題 - 衡量自己是否違背了您的特定性能目標。

代碼風格嚴格偏好個人喜好 - 爲您/您的團隊挑選任何作品。

+0

謝謝你,先生,一個清晰和簡潔的答案。在發佈之前,我會確保將來再閱讀一些內容。 – konrad

+0

我不確定你可以嚴格地說,「總是稍微快一點」。 – Enigmativity