Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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#_Linq - Fatal编程技术网

C# LINQ关键字与方法

C# LINQ关键字与方法,c#,linq,C#,Linq,我可以做到: var something = things.Where(thing => thing.stuff == yup); var somethingelse = something.Select(thing => thing.otherstuff); 或 显然,如果这是真实世界,那么关键字版本的doing也有好处: var somethingelse = from thing in something where thing.stu

我可以做到:

var something = things.Where(thing => thing.stuff == yup);
var somethingelse = something.Select(thing => 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);
无论如何,问题本身是:使用这些变体的优缺点是什么?它们是相同的,但只是语法代码方面不同吗?如果您组合两个方法版本(即上面的where/select),是否比使用关键字语法将两者组合成一行效率低


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

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

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


根据我个人的经验,某些类型的查询在一种语法中比在另一种语法中更容易阅读和/或书写,但这完全是一个观点问题,并且人与人之间确实存在差异。在任何给定情况下,使用您最熟悉的方法。

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

通过msdn

例如,必须使用方法调用来表示检索与指定条件匹配的元素数的查询


文章与所有的信息,你正在寻找

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

在这个问题上有一些答案


警告这一切都取决于LINQ的实现。

您在此处调用的LINQ查询运算符作为系统中扩展方法的语法糖。LINQ namesapce*,因此,在运行时效率方面是相同的。您甚至可以创建自己的查询操作符,如果您愿意,编译器将神奇地将其转换为方法

如果您有兴趣了解更多信息,那么《优秀作者》的第3部分将更详细地介绍LINQ,包括这个问题。另请参见MSDN上的和


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

使用查询语法(使用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基于sql的语法转换为方法调用。最终没有性能差异。如果我没记错的话,LINQ语法总是被编译成方法语法,因此不会损失任何效率。这也是我的想法,但我想确定一下。谢谢你们这一切都是为了可读性。有时我会用两种方式写,然后保留一种更容易理解的方式。我不同意你应该只使用其中一种。如果一个查询恰好更有效地适合查询语法模型,那么使用它通常会很有帮助,同样,如果一个特定的查询可以通过方法语法在逻辑上更容易理解并分解为它的组件,那么它也会更容易理解。说一个人应该被全球抛弃似乎不合适。(当然你不能放弃方法语法,因为不是所有的操作都存在于查询语法中,所以你实际上是说你不应该使用查询语法。)@Servy我不是说每个人都应该,我只是说我应该。但我并不真的同意这一点。查询语法提供了语法所具有的查询方法的子集。我理解人们做的事情是不同的,比如如果你来自SQL背景,你可能会发现查询语法更直观,但是我来自CS背景,不得不学习几个lambda演算类,因此方法语法imo更具可读性。另外,它更强大。为什么要浪费时间在两件事上,而我只能在这两件事中做得更好呢?查询语法实际上与
System.Linq
命名空间没有任何联系@Servy你是对的,我假设他正在使用
System.Linq
命名空间中的实现,考虑到问题的性质,但是
// get all distinct user names
var query1 =
    (from user in Users
    select user.Name).Distinct();

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