LINQ,Where()与FindAll()


Answers:


202

FindAll()List<T>类型上的函数,它不是LINQ扩展方法,例如Where。LINQ扩展方法可以在实现的任何类型上使用IEnumerable,而FindAll只能在List<T>实例(或者从它继承的类的实例)上使用。

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


20
是的,findall的一个懒惰版本在哪里
Pierreten

2
code.msdn.microsoft.com/LINQ-Query-Execution-ce0d3b95解释了延迟(延迟)和立即执行之间的区别。基本上,在某些情况下,您不需要整个列表,您可能希望遍历所有项目,直到发生某些事情,然后停止。这是懒惰派上用场的地方,但是根据实现的不同,可能会导致无法预料的结果(均在链接中进行了说明)。希望这可以帮助。
nurchi 2014年

10

对我来说最大的区别是.FindAll在.Net 2.0中也可用。我并不总是喜欢在.Net 3.5中进行编程,因此,我尝试记住.Net泛型集合的“本机”方法。

我自己实现了一个可用的List方法,这发生了好几次,因为我无法进行LINQ。

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

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

但是,如果您确实有LINQ,那么保持延迟执行和立即执行之间的区别就很重要。


6

如果我没记错的话,主要区别(除了在它们上实现的对象:IEnumerable<T>vs.之外List<T>)是Where实现延迟执行,即直到您需要时才真正执行查找-例如在foreach循环中使用它。 FindAll是一种立即执行方法。


3

我对80K个对象列表进行了一些测试,发现它Find()比使用Wherewith 可以快1000%FirstOrDefault()。在每次通话之前和之后测试计时器之前,我不知道这一点。有时是同一时间,而其他时候则更快。


5
您是否也尝试过访问收藏集?Enumerable.Where()使用延迟执行,并且在访问该集合之前不会得到评估,这可能导致关于其实际上是否更快的错误观念。尽管如此,在大多数情况下,使用枚举而不是静态集合(例如Type <T>和Array <T>)通常更快。
塞巴斯蒂安·乔布·比纳纳·詹森

问题是关于FindAll。很明显,查找会快于哪里(把所有的值),并获得FirstOrDefault
维韦克MVK
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.