.NET C# Predicate泛型委托使用教程

什么是 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# 代码更简洁、高效!

评论