有人能解释一下 LINQ 在 Where (. .)和 FindAll (. .)中的作用是如何不同的吗。
FindAll()是 List<T>类型的函数,它不像 Where那样是 LINQ 扩展方法。LINQ 扩展方法适用于实现 IEnumerable的任何类型,而 FindAll只能用于 List<T>实例(当然是继承它的类的实例)。
FindAll()
List<T>
Where
IEnumerable
FindAll
此外,它们在实际用途上也有所不同。Where返回在枚举对象时按需执行的 IEnumerable实例。FindAll返回一个包含所请求元素的新 List<T>。FindAll更像是在 IEnumerable的实例上调用 Where(...).ToList()。
Where(...).ToList()
如果我没记错的话,主要的区别(除了它们是在 IEnumerable<T>和 List<T>上实现的以外)是 Where实现了延迟执行,在这种情况下,它直到您需要时才实际执行查找——例如在 foreach 循环中使用它。FindAll是一种即时执行方法。
IEnumerable<T>
对我来说最大的不同是。中也可以使用 FindAll。净值2.0。我不是每次都有时间编程。Net 3.5,所以我试着记住。通用收藏净值。
有好几次我自己实现了一个已经可用的 List 方法,因为我不能 LINQ 它。
在这种情况下,我发现很方便,使用 VS2008,我 可以使用类型推断和 lambda 语法。这些是编译器特性,而不是框架特性。这意味着我可以写这个并且仍然保持内在。净值2.0:
var myOddNums = myNums.FindAll(n => n%2==1);
但是如果您确实有 LINQ 可用,那么保持延迟执行和立即执行之间的差异就很重要了。
我对80K 对象列表进行了一些测试,发现 Find()可以比使用 Where和 FirstOrDefault()快1000% 。直到每次通话前后都测试了计时器我才知道。有时候是同一时间,有时候是更快。
Find()
FirstOrDefault()
性能方面 FindAll()更好,下面是一个例子。 FindAll采用 3毫微克,而 Where采用 11毫微克。
public class SortedSearch { public static int[] CountNumbersUsingFindAll(int[] sortedArray, int lessThan) { var smaller = Array.FindAll(sortedArray,x => x < lessThan); return smaller; } public static IEnumerable<int> CountNumbersUsingWhere(int[] sortedArray,int lessThan) { var smaller = sortedArray.Where(x => x < lessThan); return smaller; } } class Program { static void Main(string[] args) { Stopwatch s = Stopwatch.StartNew(); Console.WriteLine(SortedSearch.CountNumbersUsingFindAll(new int[]{1,3,5,7},4)); Console.WriteLine(s.ElapsedMilliseconds); s.Stop(); s.Restart(); Console.WriteLine(SortedSearch.CountNumbersUsingWhere(new int[] { 1, 3, 5, 7 }, 4)); Console.WriteLine(s.ElapsedMilliseconds); s.Stop(); Console.ReadKey(); } }