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

Kod*_*oda 2 .net c# linq where

与使用集合Where()方法相比,使用LinQ进行过滤是否有任何区别.

进一步来说,

第一

var numQuery = from num in numbers
               where (num % 2) == 0
               select num;
Run Code Online (Sandbox Code Playgroud)

第二

var numQuery = numbers.Where(num => num % 2 == 0);
Run Code Online (Sandbox Code Playgroud)

在上面的查询中,哪个更好?是否有任何性能考虑?

谢谢.

Joh*_*Woo 6

没有区别.第一个是Query TypeLINQ.第二个是Extension Method类型.我更喜欢第二个,因为它有许多内置功能.

从下面的链接

"......但是方法语法和查询语法之间没有语义差异."

MSDN:LINQ查询语法与方法语法(C#)


Mac*_*ska 5

不,没有任何区别(就像约翰所指出的那样).

为了说服任何不愿意相信的人,我已经检查了哪些IL代码是生成的,并且它完全相同(下面针对那些好奇的人发布):


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     
Run Code Online (Sandbox Code Playgroud)