Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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 where和where方法之间的差异_C#_.net_Linq_Where - Fatal编程技术网

C# 集合上LINQ where和where方法之间的差异

C# 集合上LINQ where和where方法之间的差异,c#,.net,linq,where,C#,.net,Linq,Where,与使用collections Where()方法相比,使用LinQ进行过滤有什么区别吗 更具体地说 首先 第二 var numQuery = numbers.Where(num => num % 2 == 0); 在上面的查询中,哪个更好?还有性能方面的考虑吗 谢谢。没有区别。第一个是查询类型LINQ。第二种是扩展方法类型。我更喜欢第二个,因为它有许多内置功能 从下面的链接 “…但是,方法语法和查询语法之间没有语义差异。” 不,根本没有区别(正如约翰指出的那样) 为了说服任何不愿意相信的

与使用collections Where()方法相比,使用LinQ进行过滤有什么区别吗

更具体地说

首先

第二

var numQuery = numbers.Where(num => num % 2 == 0);
在上面的查询中,哪个更好?还有性能方面的考虑吗


谢谢。

没有区别。第一个是
查询类型
LINQ。第二种是
扩展方法
类型。我更喜欢第二个,因为它有许多内置功能

从下面的链接

“…但是,方法语法和查询语法之间没有语义差异。”


不,根本没有区别(正如约翰指出的那样)

为了说服任何不愿意相信的人,我检查了IL代码的产生,它完全相同(为好奇的人贴在下面):

如果返回每个条目的实例,则使用Where()扩展方法不需要选择部分
select(a=>a)

查询类型表达式始终需要表达式末尾的select part
select a
,这看起来是多余的,但却是语法所必需的

此外,First()扩展方法没有相应的查询类型语法。所以 您需要向查询类型表达式添加括号(从b中的a开始,其中a>0选择a) 对于嵌套查询,还需要向查询类型表达式添加括号。 我可以直接使用
b.First(a>0)
而不是
b.Where(a>0)。First()


因此,我提倡使用扩展方法。

希望这能有所帮助。不确定您的代码是否得到优化,但我认为使用“(num&1)==0”会更快。应该注意的是,编译器将查询理解语法转换为扩展方法调用。@JohnWoo谢谢:)我想这可能是让人们100%相信它是一样的一种方式:)@JohnWoo我在这里还是相当新的,正在尝试了解事情的工作原理。您编辑了这篇文章并只添加了一个空格吗?@MaciekTalaska:完全相同,因为编译器在编译时将查询类型转换为方法类型。根据这个@NikhilAgrawal,这就是让每个人都明白这一点的全部目的-有什么比提供IL代码更好的证据吗?@MaciekTalaska:你能帮我告诉我你从哪里产生这个IL代码吗?我也想这样做。
var numQuery = numbers.Where(num => num % 2 == 0);

IL_0001:  ldc.i4.4    
IL_0002:  newarr      System.Int32
IL_0007:  dup         
IL_0008:  ldtoken     {A078DB01-D7BE-45F4-8D98-8D2FA673C282}.$$method0x6000001-1
IL_000D:  call        System.Runtime.CompilerServices.RuntimeHelpers.InitializeArray
IL_0012:  stloc.0     
IL_0013:  ldloc.0     
IL_0014:  ldsfld      UserQuery.CS$9__CachedAnonymousMethodDelegate1
IL_0019:  brtrue.s    IL_002E
IL_001B:  ldnull      
IL_001C:  ldftn       b__0
IL_0022:  newobj      System.Func..ctor
IL_0027:  stsfld      UserQuery.CS$9__CachedAnonymousMethodDelegate1
IL_002C:  br.s        IL_002E
IL_002E:  ldsfld      UserQuery.CS$9__CachedAnonymousMethodDelegate1
IL_0033:  call        System.Linq.Enumerable.Where
IL_0038:  stloc.1     
IL_0039:  ldloc.1     
IL_003A:  call        LINQPad.Extensions.Dump

b__0:
IL_0000:  ldarg.0     
IL_0001:  ldc.i4.2    
IL_0002:  rem         
IL_0003:  ldc.i4.0    
IL_0004:  ceq         
IL_0006:  stloc.0     
IL_0007:  br.s        IL_0009
IL_0009:  ldloc.0     
IL_000A:  ret