与使用集合Where()方法相比,使用LinQ进行过滤是否有任何区别。
更具体地说,
第一
var numQuery = from num in numbers
where (num % 2) == 0
select num;
第二
var numQuery = numbers.Where(num => num % 2 == 0);
在上面的查询中,哪个更好?有没有性能考虑?
感谢。
答案 0 :(得分:6)
没有区别。第一个是Query Type
LINQ。第二个是Extension Method
类型。我更喜欢第二个,因为它有许多内置功能。</ p>
来自以下链接
“......但是方法语法和查询语法之间没有语义差异。”
答案 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()
因此,我主张使用扩展方法。