C# Linq和foreach在一条语句中是否优于两条单独的显式语句?

C# Linq和foreach在一条语句中是否优于两条单独的显式语句?,c#,linq,C#,Linq,我刚刚看到一个这样的代码 foreach (var item in Items.Where(s => s.SomeBoolProperty)) 我习惯于这样编码: var items = Items.Where(s => s.SomeBoolProperty).AsEnumerable<Whatever>(); foreach (var item in items) var items=items.Where(s=>s.SomeBoolProperty).AsEnum

我刚刚看到一个这样的代码

foreach (var item in Items.Where(s => s.SomeBoolProperty))
我习惯于这样编码:

var items = Items.Where(s => s.SomeBoolProperty).AsEnumerable<Whatever>();
foreach (var item in items)
var items=items.Where(s=>s.SomeBoolProperty).AsEnumerable();
foreach(项目中的var项目)

哪种方法更可取?为什么?

如果查询像您的情况一样简单,可以使用第一种方法。(我们在这里比较可读性)

此外,在您的情况下,项目将不会被枚举,
items
在循环的第一次迭代之前不会保存数据。这称为延迟执行

为什么要使用
AsEnumerable()
?这似乎毫无意义

var items = Items.Where(s => s.SomeBoolProperty).ToList();
foreach (var item in items)
{
}
与此不同的是:

var items = Items.Where(s => s.SomeBoolProperty);
foreach (var item in items)
{
}

第二个使用延迟执行,第一个使用
ToList()
枚举结果。因此,如果进行调试,实际上可以在
foreach
之前看到结果。但是,在第二种方法中,您需要单击(枚举)或进入
foreach
以查看结果。

如果查询与您的情况类似,那么可以使用第一种方法。(我们在这里比较可读性)

此外,在您的情况下,项目将不会被枚举,
items
在循环的第一次迭代之前不会保存数据。这称为延迟执行

为什么要使用
AsEnumerable()
?这似乎毫无意义

var items = Items.Where(s => s.SomeBoolProperty).ToList();
foreach (var item in items)
{
}
与此不同的是:

var items = Items.Where(s => s.SomeBoolProperty);
foreach (var item in items)
{
}

第二个使用延迟执行,第一个使用
ToList()
枚举结果。因此,如果进行调试,实际上可以在
foreach
之前看到结果。但是,在第二种方法中,您需要单击(枚举)或进入
foreach
以查看结果。

不需要转换为
IEnumerable
。由于
Where
返回一个
IEnumerable
,Where也是应用
Where
的对象的类型

哪一个更好?为什么

这是一个意见问题。我更喜欢第二种选择,因为它对我来说更清楚。从技术上讲,这两个版本是等效的。没有任何区别。我更清楚的原因是代码更具可读性


最初您定义一个筛选,然后您只需迭代通过此筛选的项

不需要强制转换为
IEnumerable
。由于
Where
返回一个
IEnumerable
,Where也是应用
Where
的对象的类型

哪一个更好?为什么

这是一个意见问题。我更喜欢第二种选择,因为它对我来说更清楚。从技术上讲,这两个版本是等效的。没有任何区别。我更清楚的原因是代码更具可读性


最初您定义一个筛选,然后您只需迭代通过此筛选的项

在第一个版本中,您没有调用
AsEnumerable()
。在你的第二个版本中,你是。。。所以他们在这方面不一样。但除此之外,它们是等价的。。。使用上下文中可读性最强的内容。@JonSkeet,我习惯于调用AsEnumerable,也许我不需要。不,通常不需要调用
AsEnumerable()
-如果只是要迭代结果,则不需要调用。没有人注意到OP在items.Where(s=>s.SomeBoolProperty).AsEnumerable()中编写了
var items=item哪一个错误并且无法编译?:-)@Jcl:是否假定为(Items.Where(s=>s.SomeBoolProperty)).AsEnumerable()?在第一个版本中,您没有调用
AsEnumerable()
。在你的第二个版本中,你是。。。所以他们在这方面不一样。但除此之外,它们是等价的。。。使用上下文中可读性最强的内容。@JonSkeet,我习惯于调用AsEnumerable,也许我不需要。不,通常不需要调用
AsEnumerable()
-如果只是要迭代结果,则不需要调用。没有人注意到OP在items.Where(s=>s.SomeBoolProperty).AsEnumerable()中编写了
var items=item哪一个错误并且无法编译?:-)@Jcl:是否假定为(Items.Where(s=>s.SomeBoolProperty)).AsEnumerable()?我也会使用第二种方法,没有castI,我会使用第一种方法。在第二种情况下,我想知道他将在哪里使用物品。阿加尼也将使用第二种方法,而卡斯蒂将使用第一种方法。第二,我想知道他会在哪里使用这些物品again@Jcl对不起,我赶时间。修正了。@Jcl抱歉,我赶时间。固定的