将Linq方法语法转换为查询语法

3

不是说这种方法更好,但我试图理解将以下方法语法转换为查询语法的差异。

long diskSpace = Directory.EnumerateDirectories(@"c:\")
                    .SelectMany(Directory.EnumerateFiles)
                    .Sum(fileSize => new FileInfo(fileSize).Length);
2个回答

7

该查询与以下查询大致相同:

long diskSpace = (from directory in Directory.EnumerateDirectories(@"c:\")
                  from file in Directory.EnumerateFiles(directory)
                  select file)
                 .Sum(file => new FileInfo(file).Length);

(顺便说一下,我将fileSize重命名为file以更准确地表示其含义。)

在这种情况下,有一个实际的区别-我们正在创建一个新的委托,该委托调用Directory.EnumerateFiles而不是直接从Directory.EnumerateFiles方法组创建委托。换句话说,这是一级额外的重定向-但这不会对结果产生任何影响,如果它对性能产生任何显着影响,我会感到惊讶。


谢谢,我需要再多调整一下我的思维,重新投入到 SQL 中,并练习使用双重语法,也就是连接。 - Mikael Svenson
Bart De Smet 编写了一个方便的翻译备忘单,用于方法和查询语法之间的转换。 - oillio

0

没有区别。

编译器将查询语法(也称为LINQ)转换为这些方法调用。查询语法只是语法糖,不是魔法。


3
当然有差别。它看起来不同。这正是他的全部观点 :) - Svish
在底层,它是相同的,但是对于编码来说,你可以看到有很大的区别。 - Finglas
可能更容易或更有优势选择LINQ语法。但事实仍然是相同的。当编写LINQ语法时,您通常不会考虑从匿名作用域中提取许多变量到您的“表达式”中,这是没有LINQ不可能的。然而,与一堆扩展方法和临时变量相比,LINQ语法通常更易读。 - John Leidegren
它们不都是“LINQ语法”吗? - Kirk Broadhurst

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