2

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

进一步来说,

第一的

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

第二

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

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

谢谢。

4

3 回答 3

6

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

从下面的链接

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

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

于 2012-09-06T02:10:24.277 回答
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     
于 2012-09-06T02:21:54.797 回答
0

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

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

而且,First() 扩展方法没有对应的查询类型语法。所以需要给查询类型表达式加括号(from a in b where a > 0 select a)。First() 对于嵌套查询,还需要给查询类型表达式加括号。我可以b.First(a > 0)直接使用而不是b.Where(a > 0).First()

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

于 2012-09-06T04:31:01.070 回答