Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将linq方法语法转换为查询语法_C#_.net_Linq - Fatal编程技术网

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编写了一个方便的翻译来处理方法和查询语法。