在Linq to objects中,此代码之间的执行存在任何差异:
var changedFileIDs = updatedFiles.Where(file => file.CurrentVersion != file.OriginalVersion).Select(file => file.ID);
var changedVaultFiles = filesToUpdate.Where(x => changedFileIDs.Contains(x.ID));
foreach (var file in changedVaultFiles)
{
Vault.Upload(file);
}
和这段代码?
var changedVaultFiles = filesToUpdate.Where(x => updatedFiles.Where(file => file.CurrentVersion != file.OriginalVersion).Select(file => file.ID).Contains(x.ID));
foreach (var file in changedVaultFiles)
{
Vault.Upload(file);
}
答案 0 :(得分:2)
不,性能没有区别,因为Linq的一个特性是deferred execution,换句话说,在查询变量在{{1}中迭代之前,您的查询不会被执行}或foreach
,或调用for
或ToList
扩展方法。因此,在您的第一个示例中,您正在编写主查询,但在迭代之前不会执行。
您将在此link中找到有关查询执行如何在LINQ中工作的更多详细信息。
延期执行摘要:
用户创建LINQ查询后,会将其转换为命令 树。命令树是查询的表示。命令树 然后在查询变量为时对数据源执行 迭代,而不是在创建查询变量时。在查询 执行时间,所有查询表达式(即,所有组件) 查询),包括那些在中使用的表达式 结果实现。