338.C# 中 List.FindAll 与 LINQ Where 方法的区别
摘要
在 C# 中,List<T>.FindAll 和 LINQ 的 Where 方法都用于从集合中筛选出满足特定条件的元素。尽管它们的目的相同,它们的实现和一些特性存在差异。
正文
类型限制
List<T>.FindAll 是 List<T> 类型的一个方法,它仅适用于 List<T> 实例。
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
List<int> evenNumbers = numbers.FindAll(x => x % 2 == 0); // 返回 [2, 4]
而 Where 是一个 LINQ 扩展方法,适用于任何实现了 IEnumerable<T> 接口的类型,这意味着它可以用于数组、集合、列表等。
int[] numberArray = { 1, 2, 3, 4, 5 };
IEnumerable<int> evenNumbersEnumerable = numberArray.Where(x => x % 2 == 0); // 延迟执行
返回类型
List<T>.FindAll 返回的是一个新的 List<T> 实例,包含所有满足条件的元素。
// 继续使用上面的 numbers 列表
List<int> multiplesOfThree = numbers.FindAll(x => x % 3 == 0); // 返回 [3]
Where 方法返回的是一个 IEnumerable<T> 类型的序列,这个序列是延迟执行的,直到你遍历或者调用例如 ToList、ToArray 等方法时,条件判断才会被执行。
// 使用 LINQ 的 Where 方法
IEnumerable<int> multiplesOfThreeEnumerable = numbers.Where(x => x % 3 == 0);
List<int> multiplesOfThreeList = multiplesOfThreeEnumerable.ToList(); // 现在执行查询,并返回 [3]
性能和延迟执行
List<T>.FindAll 会立即执行查询,并创建一个新的列表。这可能会在处理大型集合时产生性能问题,因为它需要分配内存来存储所有匹配的元素。
Where 方法使用延迟执行,它不会立即执行查询。这意味着如果你只需要访问部分结果或者条件很复杂时,使用 Where 可能更高效。
// 使用 Where 方法的延迟执行特性
var firstMultipleOfThree = numbers.Where(x => x % 3 == 0).FirstOrDefault(); // 只找第一个匹配的元素
总结
FindAll 和 Where 都是用于筛选集合中满足某个条件的元素,但 FindAll 是 List<T> 的特定方法,且立即执行并返回一个新的 List<T>。而 Where 是一个适用于任何 IEnumerable<T> 的 LINQ 扩展方法,它提供了延迟执行的能力,返回的是一个 IEnumerable<T> 序列,可以进一步进行链式查询或转换为其他集合类型。选择使用哪一个取决于你的具体需求和上下文。