Where()对 FindAll()

有人能解释一下 LINQ 在 Where (. .)和 FindAll (. .)中的作用是如何不同的吗。

93967 次浏览

FindAll()List<T>类型的函数,它不像 Where那样是 LINQ 扩展方法。LINQ 扩展方法适用于实现 IEnumerable的任何类型,而 FindAll只能用于 List<T>实例(当然是继承它的类的实例)。

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

如果我没记错的话,主要的区别(除了它们是在 IEnumerable<T>List<T>上实现的以外)是 Where实现了延迟执行,在这种情况下,它直到您需要时才实际执行查找——例如在 foreach 循环中使用它。FindAll是一种即时执行方法。

对我来说最大的不同是。中也可以使用 FindAll。净值2.0。我不是每次都有时间编程。Net 3.5,所以我试着记住。通用收藏净值。

有好几次我自己实现了一个已经可用的 List 方法,因为我不能 LINQ 它。

在这种情况下,我发现很方便,使用 VS2008,我 可以使用类型推断和 lambda 语法。这些是编译器特性,而不是框架特性。这意味着我可以写这个并且仍然保持内在。净值2.0:

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

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

我对80K 对象列表进行了一些测试,发现 Find()可以比使用 WhereFirstOrDefault()快1000% 。直到每次通话前后都测试了计时器我才知道。有时候是同一时间,有时候是更快。

性能方面 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();
}
}