2009-11-18 49 views
2

我想知道哪两个代码示例会更有效率(或两者之间的差异可以忽略不计)?如果语句或Where扩展与For Each循环?

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 

谢谢!

回答

2

的差异可以忽略不计,而第二代码更具可读性,所以你应该喜欢,如果你想要一个

+0

关于可读性的有趣点,我一直在想,为什么VB.NET从来没有在那里改进过。随着LINQ的发生,C#和VB之间的可读性差距只会变大,这对于VB编码器来说已经成为一个巨大的责任。 – Abel 2009-11-18 16:02:45

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,例如,它会尝试将Where条款到SQL翻译 - 这是行不通的。

假设你使用LINQ to Objects,那么这个赋值实际上不会做任何循环 - 它只会设置查询。只有在循环查询时才会对每个项目评估“where”子句。

+0

+1:将'有趣的东西'和'我要做什么'分离开来也是我的回答。 – cfern 2009-11-19 09:39:34

0

的表现应该是差不多的,所以我会去为更可读的办法:

var applesOnSale = from apple in AppleController.GetRedApples() 
        where PriceController.OnSale(apple) 
        select apple; 

foreach(var apple in applesOnSale) 
{ 
    //do stuff 
} 

这是一样的你的第二个选择,但触摸更具可读性。

+0

刚刚意识到原来的问题是在VB.NET中,我不想尝试将其移植到vb.net(因为我不太熟悉它的语法),但我相信也可以做到这一点。 – Gord 2009-11-18 16:07:30

+0

在这种情况下,我实际上不会使用查询表达式 - 考虑到您不得不使用“select”,它最终会比“直接调用Where”更“蓬松”。但是,VB中的查询不需要select子句,因此在VB中查询表达式可能更好。 – 2009-11-18 16:14:27