C# 将linq方法语法转换为查询语法
并不是说这样会更好,但我正试图改变我的思路,将下面的方法语法转换为查询语法,以查看差异C# 将linq方法语法转换为查询语法,c#,.net,linq,C#,.net,Linq,并不是说这样会更好,但我正试图改变我的思路,将下面的方法语法转换为查询语法,以查看差异 long diskSpace = Directory.EnumerateDirectories(@"c:\") .SelectMany(Directory.EnumerateFiles) .Sum(fileSize => new FileInfo(fileSize).Length); 没有区别 long diskSpace
long diskSpace = Directory.EnumerateDirectories(@"c:\")
.SelectMany(Directory.EnumerateFiles)
.Sum(fileSize => new FileInfo(fileSize).Length);
没有区别
long diskSpace = Directory.EnumerateDirectories(@"c:\")
.SelectMany(Directory.EnumerateFiles)
.Sum(fileSize => new FileInfo(fileSize).Length);
编译器将查询语法(也称为LINQ)转换为这些方法调用。查询语法只是语法上的suguar。这不是魔术。该查询主要相当于:
long diskSpace = (from directory in Directory.EnumerateDirectories(@"c:\")
from file in Directory.EnumerateFiles(directory)
select file)
.Sum(file => new FileInfo(file).Length);
(顺便说一句,我已将fileSize
重命名为file
,以更准确地表达意思。)
在这种情况下有一个实际的区别——我们正在创建一个新的委托,它调用
目录.EnumerateFiles
,而不是直接从目录.EnumerateFiles
方法组创建委托。换句话说,这是一个额外的重定向级别-但这不会对结果产生任何影响,如果它对性能有任何显著影响,我会感到惊讶。当然有区别。看起来不一样。这就是他的全部观点:)在引擎盖下,这是相同的,是的,但是对于编码,正如你所看到的,有很大的不同。使用LINQ语法可能更容易,或者更冒险。但事实仍然是,它是相同的。在编写LINQ语法时,您通常不会想到的一点是,您将许多变量从匿名范围拉入“表达式”中,没有LINQ,这是不可能的。然而,LINQ语法通常比扩展方法和临时变量的网格更具可读性。它们不是都是“LINQ语法”吗?谢谢,我需要再次调整我对sql的看法,并练习双重from语法,这将是连接。Bart De Smet编写了一个方便的翻译来处理方法和查询语法。