LINQ关键词vs.方法

本文关键字:方法 vs 关键词 LINQ | 更新日期: 2023-09-27 18:12:58

我可以:

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;

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

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);

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

LINQ关键词vs.方法

我喜欢LINQ,我不想因为使用一种类型或另一种类型而失去任何效率。

查询语法将由编译器在第一次传递中转换为方法语法,然后在第二次传递中从该方法语法编译为IL代码。使用查询语法编写的代码与直接使用方法语法编写的代码在最终编译的代码中没有差异。(虽然不是所有的方法都用查询语法表示,所以有些查询不能在不部分或完全使用方法语法的情况下编写)

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

从我个人的经验来看,某些类型的查询用一种语法比用另一种语法更容易阅读和/或编写,但这完全是一个观点问题,而且确实因人而异。

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

这个帖子有一些关于这个问题的答案。

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

通过msdn;

"例如,您必须使用一个方法调用来表达一个查询,该查询检索符合指定条件的元素的数量。"

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

当使用查询语法(使用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();

如果你问我,请尽可能使用查询语法。如果绝对必要,使用方法调用语法。混合样式是一种判断,只要选择更容易阅读和一致的样式就可以了。

您在这里调用的LINQ查询操作符作为系统中扩展方法的语法糖。就运行时效率而言,Linq命名空间*和这样的命名空间是相同的。您甚至可以创建自己的查询操作符,如果您愿意的话,编译器会将其神奇地转换为方法。

Jon Skeet的优秀c# in Depth的第3部分涵盖了LINQ,包括这个问题,如果您有兴趣了解更多,可以更详细地了解。另见MSDN上的http://msdn.microsoft.com/en-us/library/vstudio/bb397947.aspx和http://msdn.microsoft.com/en-us/library/vstudio/bb397896.aspx。

*你也可以提供你自己的通常在系统中公开的扩展方法的实现。