LINQ,Where()vs FindAll()

Gra*_*ant 116 c# linq syntax

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

Ada*_*son 195

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

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

  • 是的,findall的懒惰版本在哪里 (20认同)
  • http://code.msdn.microsoft.com/LINQ-Query-Execution-ce0d3b95解释了延迟(延迟)和立即执行之间的区别.基本上,在某些情况下,您不需要整个列表,您可能希望遍历项目直到发生某些事情,然后停止.这是懒惰派上用场的地方,但根据实施情况,可能导致不可预测的结果(所有内容都在链接中解释).希望这可以帮助. (2认同)

cfe*_*ern 10

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

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

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

var myOddNums = myNums.FindAll(n => n%2==1);
Run Code Online (Sandbox Code Playgroud)

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


Way*_*neC 6

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