1

我可以:

var something = things.Where(thing => thing.stuff == yup);
var somethingelse = something.Select(thing => thing.otherstuff);

或者

var something = from thing in things
                where thing.stuff == yup
                select thing;
var somethingelse = from thing in something
                    select thing.otherstuff;

显然,如果这是现实世界,那么关键字版本的好处是:

var somethingelse = from thing in something
                    where thing.stuff == yup
                    select thing.otherstuff;

但是当然你可以争辩说你可以这样做:

var somethingelse = things.Where(thing => thing.stuff == yup)
                          .Select(thing => thing.otherstuff);

无论如何,问题本身:使用这些变体中的每一个的优点/缺点是什么?它们是否相同但只是语法代码端不同?如果您结合两个方法版本(即上面的 where/select),它是否比使用关键字语法将两者结合到一行中效率低?

我喜欢 LINQ,我不想失去任何可以通过使用一种或另一种类型获得的效率。

4

5 回答 5

3

编译器在第一遍中将查询语法转换为方法语法,然后在第二遍中从该方法语法编译成 IL 代码。使用查询语法编写的代码与直接用方法语法编写的代码在生成的编译代码中没有区别。(虽然并非所有方法都以查询语法表示,因此如果不部分或完全使用方法语法,就无法编写某些查询。)

唯一的区别是编码者的个人偏好;你觉得更容易读或写的东西。

根据我的个人经验,某些类型的查询在一种语法中比另一种更容易阅读和/或编写,但这完全是一个见仁见智的问题,并且因人而异。在任何给定情况下使用您最舒服的那个。

于 2013-05-10T17:18:00.447 回答
0

根据 MSDN,一些查询必须用方法语法编写,但通常它们是相同的。查询语法在编译之前转换为方法语法,因此它们最终生成相同的 IL。我个人更喜欢方法语法。我认为一致性很重要,所以我只使用方法语法。

通过 msdn;

“例如,您必须使用方法调用来表达一个查询,该查询检索与指定条件匹配的元素数量。”

包含您正在寻找的所有信息的文章;http://msdn.microsoft.com/en-us/library/vstudio/bb397947.aspx

于 2013-05-10T17:21:28.180 回答
0

编译器将以相同的方式处理方法和 LINQ 语法中的代码。使用可能取决于您自己的能力和偏好。

这个 SO 线程在这个问题上有一些答案。

这个 SO answer警告说,这一切都取决于 LINQ 的实现。

于 2013-05-10T17:27:52.317 回答
0

您在此处调用的 LINQ 查询运算符充当 System.Linq 命名空间* 中扩展方法的语法糖,因此,就运行时效率而言,它们是相同的。如果您愿意,您甚至可以创建自己的查询操作符,编译器会神奇地将其转换为方法。

Jon Skeet 撰写的优秀C# in Depth的第 3 部分涵盖了 LINQ,包括这个问题,如果您有兴趣了解更多信息,则会更详细地介绍。另请参阅MSDN 上的http://msdn.microsoft.com/en-us/library/vstudio/bb397947.aspxhttp://msdn.microsoft.com/en-us/library/vstudio/bb397896.aspx

*您还可以提供您自己的通常在 System.Linq 命名空间中公开的扩展方法的实现,就像您可以创建自定义 LINQ 运算符一样。

于 2013-05-10T17:28:44.783 回答
0

使用查询语法(使用 LINQ 关键字)时,编译器将代码转换为相应的 LINQ 方法调用,从而产生等效代码。就查询而言,性能没有差异,每个都应该产生相同的结果。它只会影响查询的可读性,具体取决于您更喜欢哪个。

查询语法的唯一“问题”(如果您这样看的话)是它将转换为一组特定的 LINQ 方法。如果您查看所有可用的 LINQ 方法,就会发现许多标准运算符以及查询语法中不可用的其他方法都有额外的重载可用。您将无法在此类查询中使用这些方法。

例如,您不能Distinct()在使用查询语法的查询上使用运算符(截至目前,希望在未来的版本中并向后移植)。如果你想使用它,你必须使用方法语法。因此,您将不得不混合语法(当查询变得更复杂恕我直言时,这有点难看)或专门使用方法调用。

// get all distinct user names
var query1 =
    (from user in Users
    select user.Name).Distinct();

// vs.
var query2 = Users
    .Select(user => user.Name)
    .Distinct();

如果您问我,请尽可能使用查询语法。如果绝对必要,请使用方法调用语法。混合风格是一种判断,只要选择更具可读性和一致性的东西。

于 2013-05-10T17:34:17.520 回答