如果声明或Where扩展带有For Each循环?

时间:2009-11-18 15:50:18

标签: .net vb.net performance linq-to-objects

我想知道两个代码样本中的哪一个会更有效(或两者之间的差异可以忽略不计)?

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

谢谢!

4 个答案:

答案 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
}

这与您的第二个选项相同,但触摸性更强。