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一个计时器。 有时是同一时间,其他时间更快。