我想知道两个代码样本中的哪一个会更有效(或两者之间的差异可以忽略不计)?
For Each apple in AppleController.GetRedApples().Where(Function(a) PriceController.OnSale(a))
'do something
Next
或
For Each apple in AppleController.GetRedApples()
If PriceController.OnSale(apple) Then
'do something
End If
Next
谢谢!
答案 0 :(得分:2)
我个人将其分开:
Dim applesOnSale = AppleController.GetRedApples() _
.Where(Function(a) PriceController.OnSale(a))
For Each apple in applesOnSale
'do something
Next
在完整的IDE中,第一部分可以是单行 - 或者您可以使用这样的VB查询表达式:
Dim applesOnSale = From apple in AppleController.GetRedApples() _
Where PriceController.OnSale(apple)
For Each apple in applesOnSale
'do something
Next
这将“您感兴趣的项目”与“您想对项目做什么”分开,我个人觉得这些项目在可读性方面很有用。
请注意,在某些情况下Where
可能不起作用,但是如果GetRedApples
从LINQ返回表格到SQL DataContext
,它会尝试翻译{ {1}}子句进入SQL - 这将无效。
假设你正在使用LINQ to Objects,那么赋值实际上不会进行任何循环 - 它只会设置查询。只有在循环查询时才会为每个项目评估“where”子句。
答案 1 :(得分:2)
差异可以忽略不计,第二个代码更易读,所以你应该更喜欢那个
答案 2 :(得分:0)
考虑foreach vs linq/lambda上的讨论(Jon Skeet的回答;-),如果你想delve deeper into understanding LINQ / Lambda efficiency和表现,请考虑这个。
答案 3 :(得分:0)
性能应该大致相同,因此我会采用更易读的方法:
var applesOnSale = from apple in AppleController.GetRedApples()
where PriceController.OnSale(apple)
select apple;
foreach(var apple in applesOnSale)
{
//do stuff
}
这与您的第二个选项相同,但触摸性更强。