LINQ,Where()vs FindAll()

时间:2009-12-21 04:35:31

标签: c# linq syntax

有人可以解释LINQ函数Where(..)和FindAll(..)的区别吗?他们似乎都做同样的事情......

4 个答案:

答案 0 :(得分:186)

FindAll()List<T>类型的函数,它不是Where之类的LINQ扩展方法。 LINQ扩展方法适用于实现IEnumerable的任何类型,而FindAll只能用于List<T>个实例(或者从它继承的类的实例)。

此外,它们的实际目的不同。 Where返回枚举对象时按需执行的IEnumerable实例。 FindAll返回包含所请求元素的新List<T>FindAll更像是在Where(...).ToList()的实例上调用IEnumerable

答案 1 :(得分:9)

对我来说最大的不同是.FindAll也可以在.Net 2.0中使用。我并不总是可以在.Net 3.5中编程,所以我尝试记住.Net泛型集合的“原生”方法。

有几次我自己实现了一个已经可用的List方法,因为我无法LINQ它。

在这种情况下我觉得很方便的是,使用VS2008,我可以使用类型推断和lambda语法。这些是编译器功能,而不是框架功能。这意味着我可以写这个并仍然保留在.Net 2.0中:

var myOddNums = myNums.FindAll(n => n%2==1);

但是如果你确实有LINQ可用,那么保持延迟执行和立即执行之间的区别非常重要。

答案 2 :(得分:5)

如果我没记错的话,主要区别(除了它们在IEnumerable<T>List<T>上实现的内容)是Where实现了延迟执行,而实际上并没有在您需要之前进行查找 - 例如在foreach循环中使用它。 FindAll是一种立即执行方法。

答案 3 :(得分:3)

我对80K对象列表进行了一些测试,发现Find()比使用Where FirstOrDefault()的速度快1000%。在每次通话之前和之后测试计时器之前我都不知道。有时它是同一时间,有时则更快。