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