有人可以解释LINQ函数Where(..)和FindAll(..)的区别吗?他们似乎都在做同样的事情...
有人可以解释LINQ函数Where(..)和FindAll(..)的区别吗?他们似乎都在做同样的事情...
Answers:
FindAll()
是List<T>
类型上的函数,它不是LINQ扩展方法,例如Where
。LINQ扩展方法可以在实现的任何类型上使用IEnumerable
,而FindAll
只能在List<T>
实例(或者从它继承的类的实例)上使用。
此外,它们在实际用途上有所不同。Where
返回IEnumerable
枚举对象时按需执行的实例。FindAll
返回一个新的List<T>
,其中包含所请求的元素。FindAll
更像是调用Where(...).ToList()
的实例IEnumerable
。
对我来说最大的区别是.FindAll在.Net 2.0中也可用。我并不总是喜欢在.Net 3.5中进行编程,因此,我尝试记住.Net泛型集合的“本机”方法。
我自己实现了一个可用的List方法,这发生了好几次,因为我无法进行LINQ。
在这种情况下,我觉得很方便的是,使用VS2008,我可以使用类型推断和lambda语法。这些是编译器功能,而不是框架功能。这意味着我可以编写此代码,并且仍然保留在.Net 2.0中:
var myOddNums = myNums.FindAll(n => n%2==1);
但是,如果您确实有LINQ,那么保持延迟执行和立即执行之间的区别就很重要。
我对80K个对象列表进行了一些测试,发现它Find()
比使用Where
with 可以快1000%FirstOrDefault()
。在每次通话之前和之后测试计时器之前,我不知道这一点。有时是同一时间,而其他时候则更快。