.net If语句或带有For-Each循环的Where扩展?

.net If语句或带有For-Each循环的Where扩展?,.net,vb.net,performance,linq-to-objects,.net,Vb.net,Performance,Linq To Objects,我想知道这两个代码示例中哪一个更有效(或者两者之间的差异可以忽略不计) 或 谢谢 我个人会把它分开: Dim applesOnSale = AppleController.GetRedApples() _ .Where(Function(a) PriceController.OnSale(a)) For Each apple in applesOnSale 'do something Next 在完整IDE中,第一部分可

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


谢谢

我个人会把它分开:

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对象,那么赋值实际上不会执行任何循环-它只会设置查询。当您循环查询时,“where”子句将只针对每个项目进行计算。

差异可以忽略,第二个代码可读性更高,因此您可能更希望其中一个可以考虑此讨论(也是Jon Skeet的答案;-)如果您想了解性能和性能,请选择此选项。

性能应该大致相同,因此我选择更具可读性的方法:

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

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

这与您的第二个选项相同,但更具可读性。

关于可读性的有趣一点,我一直想知道为什么VB.NET在这方面从未改进过。随着LINQ事件的发生,C#和VB之间的可读性差距只会变得更大,这对VB程序员来说是一个巨大的负担。刚刚意识到最初的问题是在VB.NET中,我不想尝试将其移植到VB.NET(因为我对它的语法不太精通)但我相信也可以做到这一点。在这种情况下,我实际上不会使用查询表达式——因为您被迫使用“select”,它最终会比直接调用Where更“模糊”。然而,VB中的查询不需要select子句,因此在VB中使用查询表达式可能更好。+1:将“有趣的内容”和“我将如何处理它”分开也是我的答案。
Dim applesOnSale = From apple in AppleController.GetRedApples() _
                   Where PriceController.OnSale(apple)

For Each apple in applesOnSale
   'do something
Next
var applesOnSale = from apple in AppleController.GetRedApples()
                   where PriceController.OnSale(apple)
                   select apple;

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