标记的答案让它有点不准确。
正如@Philippe说,第一个将被翻译成:
objectList.Where(o => o.value1 < 100 && o.value2 > 10)
但是Linq
具有:
objectList.Where(o => o.value1 < 100).Where(o=> o.value2 > 10)
而第二个将被转换对链接的Where
调用稍作优化。
如果检查Linq's
源代码,你会看到以下内容:
class WhereEnumerableIterator<TSource> : Iterator<TSource>
{
public override IEnumerable<TSource> Where(Func<TSource, bool> predicate)
{
return new WhereEnumerableIterator<TSource>(source,
CombinePredicates(this.predicate, predicate));
}
}
什么CombinePredicates
不会是在两个谓语用&&
结合他们之间:
static Func<TSource, bool> CombinePredicates<TSource>(Func<TSource, bool> predicate1,
Func<TSource, bool> predicate2)
{
return x => predicate1(x) && predicate2(x);
}
所以objectList.Where(X).Where(Y)
相当于objectList.Where(X && Y)
除了查询的创建时间(无论如何都非常短)和调用两个谓词。
底线是它不过滤器或重复收集两次 - 而是一个复合的时间。
其实这是相当不准确的。如果你检查'Linq'的源代码,你会看到'Where'有一个将'.Where(x).Where(y)'转换成'.Where(x && y)'的方法。 [源代码](http://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,f7e72dc9c9621f30) –
好点,我无法说如果我在2009年检查过它,或者如果它是一直如此。 – Philippe