2010-03-11 122 views
2

这两个陈述中的哪一个更快/更好的做法?Linq方法体最佳实践问题

myList.Where(x => 
      { 
       bool itemOne= x.ItemOne == paramItemOne; 
       bool itemTwo = x.ItemTwo == paramItemTwo; 
       return itemOne && itemTwo; 
      }) 


myList.Where(x => x.ItemOne == paramItemOne).Where(x=>x.ItemTwo == paramItemTwo) 

or they are the same?

回答

7

我不会说。最快的将是:

myList.Where(x => x.ItemOne == paramItemOne && x.ItemTwo == paramItemTwo) 

(假定编译器/ JIT不优化掉在第一形式的变量赋值)

第二种形式将是慢,因为它可能涉及显著多个方法调用提供给Where语句的代表。

+1

编译器无法优化第一种形式的第二个布尔值 - 它会消除副作用。 – SLaks 2010-03-11 22:21:13

0

表现会相同或非常接近。第二个可能会有更多的方法开销。

比性能更重要的是,我会说第一个是更好的做法,因为它是更加清晰

1

结果都是一样的,但是,我建议你,而不是写:

myList.Where(x => 
      { 
       return x.ItemOne == paramItemOne && x.ItemTwo == paramItemTwo; 
      }); 

这是保证工作得更快,因为现在x.ItemTwo == paramItemTwo将不被计算,甚至如果x.ItemOne == paramItemOne

+0

呃......这两个条件都必须满足,所以你的最终断言不成立。两个谓词都必须进行AND评估才能评估为真。然而,在x.ItemOne!= paramItemOne的情况下,第二个谓词将不被计算,但这也适用于Where()。Where()表单,因为由第一个Where语句过滤的项目不会成为第二个Where执行的枚举。 – spender 2010-03-12 00:28:02

0

首先检查每个列表项目的两个条件。 第二个条件过滤器,然后过滤第二个条件的结果。

第二个是创建并填充另一个临时集合,但较少比较第二个条件。