2016-08-17 81 views
4

在LINQ to对象是有这个代码之间在执行任何区别:LINQ到对象多条语句与单个语句

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

不,性能没有差异。 (除非你没有在第一个集合中调用'ToArray') – 2016-08-17 13:07:11

回答

2

没有,在性能上没有什么区别,因为LINQ的特征之一是deferred execution,换句话说,您的查询是不会被执行,直到查询变量是在foreachfor遍历,或者调用ToListToArray扩展方法。因此,在第一个示例中,您正在编写主要查询,但在遍历它之前不会执行。

你会发现在这个link有关查询执行如何在LINQ中工作的更多细节。

延迟执行概要:LINQ查询是由用户创建

之后,它被转换成一个命令 树。命令树是查询的表示。然后,在查询变量为 (而不是查询变量创建时)时,针对数据源执行命令树 。在查询 执行时间,评估所有查询表达式(即查询的所有组件),包括在结果实现中使用的那些表达式。

+0

谢谢,这是我的想法,但想要确认,并找不到任何明确说明它的来源。也许我只是使用了错误的搜索条件。 – Adam