什么是 Predicate<T>?
Predicate<T> 是 .NET 中的一个 泛型委托,用于定义 返回 bool 的方法,常用于 过滤列表、条件判断等场景。它的定义如下:
public delegate bool Predicate<T>(T obj);
这个委托接收一个 泛型参数 T,并返回一个 布尔值 (bool)。如果返回 true,表示该对象符合某个条件,否则返回 false。
Predicate<T> 的基本用法
Predicate<T> 常用于 List<T>.Find、FindAll、Exists、RemoveAll 等方法,帮助筛选符合特定条件的元素。
示例 1:使用 Predicate<T> 过滤列表
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<int> numbers = new List<int> { 1, 3, 5, 8, 10, 12 };
// 使用 Predicate<T> 过滤偶数
Predicate<int> isEven = n => n % 2 == 0;
// 使用 FindAll 方法查找所有偶数
List<int> evenNumbers = numbers.FindAll(isEven);
Console.WriteLine(string.Join(", ", evenNumbers)); // 输出: 8, 10, 12
}
}
Predicate<int> isEven = n => n % 2 == 0; 定义了一个 Predicate 委托,判断 n 是否是偶数。
numbers.FindAll(isEven); 通过 FindAll 方法获取所有符合 isEven 条件的元素。
Predicate<T> 与 List<T> 方法结合使用
Predicate<T> 经常与 List<T> 一起使用,下面介绍几个常见方法:
示例 2:Find - 查找第一个匹配的元素
List<string> names = new List<string> { "Alice", "Bob", "Charlie", "David" };
// 查找第一个长度大于 3 的名字
string result = names.Find(name => name.Length > 3);
Console.WriteLine(result); // 输出: "Alice"
Find 方法返回 第一个 满足 Predicate<T> 条件的元素,如果找不到则返回 null(引用类型)或 default(值类型)。
示例 3:Exists - 判断是否有匹配的元素
bool hasShortName = names.Exists(name => name.Length < 4);
Console.WriteLine(hasShortName); // 输出: True("Bob" 符合)
Exists 方法返回 true 或 false,表示列表中是否存在符合条件的元素。
示例 4:RemoveAll - 删除符合条件的元素
List<int> numbers = new List<int> { 2, 5, 7, 8, 10 };
// 删除所有偶数
int removedCount = numbers.RemoveAll(n => n % 2 == 0);
Console.WriteLine(removedCount); // 输出: 3
Console.WriteLine(string.Join(", ", numbers)); // 输出: 5, 7
RemoveAll 方法会 移除所有满足 Predicate<T> 条件的元素,并返回删除的数量。
示例 5:TrueForAll - 判断所有元素是否符合条件
bool allShortNames = names.TrueForAll(name => name.Length < 10);
Console.WriteLine(allShortNames); // 输出: True
TrueForAll 方法会检查 列表中所有元素是否都满足 Predicate<T> 条件,如果全部满足,则返回 true,否则返回 false。
Predicate<T> 的高级用法
示例 6:作为参数传递
Predicate<T> 可以作为参数传递给方法,使方法能够接受不同的条件。
static void PrintFilteredNames(List<string> names, Predicate<string> condition)
{
foreach (var name in names.FindAll(condition))
{
Console.WriteLine(name);
}
}
List<string> names = new List<string> { "Alice", "Bob", "Charlie", "David" };
Console.WriteLine("名字长度大于 3:");
PrintFilteredNames(names, name => name.Length > 3);
PrintFilteredNames 方法接收一个 Predicate<string> 作为参数,允许调用时传递不同的筛选条件。
FindAll(condition) 根据传入的 Predicate<T> 过滤列表并打印符合条件的元素。
总结
Predicate<T> 是 返回 bool 的泛型委托,用于 判断元素是否满足某个条件。它经常与 List<T>.Find、FindAll、Exists、RemoveAll 等方法配合使用,帮助简化代码。可以使用 Lambda 表达式 (x => 条件) 直接定义 Predicate<T>,提高代码可读性。也可以作为参数传递,使方法更具灵活性和复用性。
推荐使用场景
- 在列表中 查找、筛选、删除元素
- 作为 参数传递,让方法支持自定义的匹配条件
- 提高代码可读性,避免使用复杂的 for 或 foreach 语句手动遍历列表
掌握 Predicate<T>,可以让 C# 代码更简洁、高效!