2017-03-07 122 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