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

时间:2012-09-06 02:09:05

标签: c# .net linq where

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

更具体地说,

第一

var numQuery = from num in numbers
               where (num % 2) == 0
               select num;

第二

var numQuery = numbers.Where(num => num % 2 == 0);

在上面的查询中,哪个更好?有没有性能考虑?

感谢。

3 个答案:

答案 0 :(得分:6)

没有区别。第一个是Query Type LINQ。第二个是Extension Method类型。我更喜欢第二个,因为它有许多内置功能。<​​/ p>

来自以下链接

  

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

<强> MSDN: LINQ Query Syntax versus Method Syntax (C#)

答案 1 :(得分: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     

答案 2 :(得分:0)

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

查询类型表达式始终需要表达式末尾的选择部分select a,这看起来是多余的,但语法是必需的。

此外,First()扩展方法没有相应的查询类型语法。所以 你需要在查询类型表达式中添加括号(从b中a>&gt; 0选择a).First() 对于嵌套查询,还需要在查询类型表达式中添加括号。 我可以直接使用b.First(a > 0)代替b.Where(a > 0).First()

因此,我主张使用扩展方法。