与使用集合 Where() 方法相比,使用 LinQ 进行过滤有什么区别。
进一步来说,
第一的
var numQuery = from num in numbers
where (num % 2) == 0
select num;
第二
var numQuery = numbers.Where(num => num % 2 == 0);
在上面的查询中,哪个更好?是否有任何性能考虑?
谢谢。
没有区别。第一个是Query Type
LINQ。第二个是Extension Method
类型。我更喜欢第二个,因为它具有许多内置功能。
从下面的链接
“......但是方法语法和查询语法之间没有语义差异。”
不,根本没有区别(正如约翰指出的那样)。
为了说服任何不愿意相信的人,我检查了生成的 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
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()
因此,我提倡使用扩展方法。