有人可以解释LINQ函数Where(..)和FindAll(..)的区别吗?他们似乎都做同样的事情......
答案 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%。在每次通话之前和之后测试计时器之前我都不知道。有时它是同一时间,有时则更快。