LINQ to Objects 多个语句 vs 单个语句

4
在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);
}

没有性能上的区别。(除非您没有在第一个集合上调用 ToArray - user586399
1个回答

3
不,性能上没有区别,因为 Linq 的一个特点是 deferred execution,换句话说,只有在迭代 foreachfor,或调用 ToListToArray 扩展方法时,查询变量才会被执行。因此,在您的第一个示例中,您正在组合主查询,但只有在迭代它时才会执行。
您可以在此 link 中找到有关 LINQ 查询执行方式的更多详细信息。 Deferred Execution 摘要:
当用户创建了一个LINQ查询之后,它会被转换成一个命令树。命令树是查询的一种表示形式。当迭代查询变量时,命令树会被执行并针对数据源进行操作,而不是在创建查询变量时执行。在查询执行时,所有查询表达式(即查询的所有组件)都会被评估,包括那些用于结果物化的表达式。

谢谢,这正是我所想的,但我需要确认,而且找不到任何明确说明的来源。也许我只是使用了错误的搜索词。 - Adam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接