LINQ,Where()与FindAll()
有人可以解释LINQ函数在哪里(..)和FindAll(..)有什么不同? 他们似乎都做同样的事情…
FindAll()
是List<T>
types的函数,它不是像Where
这样的LINQ扩展方法。 LINQ扩展方法适用于实现IEnumerable
任何types,而FindAll
只能用于List<T>
实例(或者inheritance自类的实例)。
另外,它们在实际用途上有所不同。 Where
返回枚举对象时按需执行的IEnumerable
实例。 FindAll
返回一个新的List<T>
,其中包含所请求的元素。 FindAll
更像是Where(...).ToList()
IEnumerable
的实例上调用Where(...).ToList()
。
对我来说最大的区别是.FindAll也可以在.Net 2.0中使用。 我并不总是奢侈地在.Net 3.5中编程,所以我试图记住.Net通用集合的“原生”方法。
发生了几次,我自己实现了一个已经可用的List方法,因为我不能LINQ它。
在这种情况下我觉得方便的是,使用VS2008,我可以使用types推断和lambda语法。 这些是编译器function,而不是框架function。 这意味着我可以写这个,仍然保持在.Net 2.0中:
var myOddNums = myNums.FindAll(n => n%2==1);
但是,如果你有LINQ可用,保持延迟执行和立即执行之间的差异是重要的。
如果我记得正确的话,主要区别(除了它们实现的是: IEnumerable<T>
与List<T>
)是Where
实现延迟执行,直到您需要它实际上不执行查找 -例如在foreach循环中使用它。 FindAll
是立即执行的方法。
我在80K对象列表上做了一些testing,发现Find()
比使用FirstOrDefault()
方法的速度快1000%。 我不知道,直到每次通话之前和之后testing一个计时器。 有时是同一时间,其他时间更快。