Linq来对象多个语句与单个语句

时间:2016-08-17 12:55:48

标签: c# .net linq

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

1 个答案:

答案 0 :(得分:2)

不,性能没有区别,因为Linq的一个特性是deferred execution,换句话说,在查询变量在{{1}中迭代之前,您的查询不会被执行}或foreach,或调用forToList扩展方法。因此,在您的第一个示例中,您正在编写主查询,但在迭代之前不会执行。

您将在此link中找到有关查询执行如何在LINQ中工作的更多详细信息。

延期执行摘要

  

用户创建LINQ查询后,会将其转换为命令   树。命令树是查询的表示。命令树   然后在查询变量为时对数据源执行   迭代,而不是在创建查询变量时。在查询   执行时间,所有查询表达式(即,所有组件)   查询),包括那些在中使用的表达式   结果实现。