跳到主要内容

C# Predicate 委托

介绍

在 C# 中,Predicate 委托是一种特殊的委托类型,用于表示一个返回布尔值的方法。它通常用于对集合中的元素进行条件判断,例如筛选出满足特定条件的元素。Predicate 委托的签名如下:

csharp
public delegate bool Predicate<in T>(T obj);

其中,T 是输入参数的类型,obj 是输入参数,返回值是一个布尔值(truefalse)。

提示

Predicate 委托通常与 List<T>.FindAllArray.FindAll 等方法一起使用,用于筛选集合中的元素。

基本用法

让我们从一个简单的例子开始,了解如何使用 Predicate 委托。

示例 1:筛选偶数

假设我们有一个整数列表,我们希望筛选出其中的偶数。我们可以使用 Predicate 委托来实现这一点。

csharp
using System;
using System.Collections.Generic;

class Program
{
static void Main()
{
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

// 使用 Predicate 委托筛选偶数
Predicate<int> isEven = num => num % 2 == 0;
List<int> evenNumbers = numbers.FindAll(isEven);

// 输出结果
Console.WriteLine("偶数列表:");
foreach (int num in evenNumbers)
{
Console.WriteLine(num);
}
}
}

输出:

偶数列表:
2
4
6
8
10

在这个例子中,我们定义了一个 Predicate<int> 委托 isEven,它接受一个整数并返回一个布尔值,表示该整数是否为偶数。然后,我们使用 List<int>.FindAll 方法筛选出所有满足条件的偶数。

备注

FindAll 方法返回一个新的列表,其中包含所有满足 Predicate 条件的元素。

逐步讲解

1. 定义 Predicate 委托

Predicate 委托的定义非常简单。它接受一个输入参数(类型为 T),并返回一个布尔值。例如:

csharp
Predicate<int> isPositive = num => num > 0;

在这个例子中,isPositive 是一个 Predicate 委托,它接受一个整数并返回 true 如果该整数大于 0,否则返回 false

2. 使用 Predicate 委托

Predicate 委托通常用于集合操作,例如筛选、查找等。以下是一些常见的用法:

  • 筛选元素:使用 FindAll 方法筛选出满足条件的元素。
  • 查找元素:使用 Find 方法查找第一个满足条件的元素。
  • 检查元素是否存在:使用 Exists 方法检查集合中是否存在满足条件的元素。

3. 实际案例

让我们通过一个实际案例来进一步理解 Predicate 委托的用法。

案例:筛选出年龄大于 18 岁的人

假设我们有一个 Person 类,表示一个人的信息。我们希望筛选出年龄大于 18 岁的人。

csharp
using System;
using System.Collections.Generic;

class Person
{
public string Name { get; set; }
public int Age { get; set; }

public Person(string name, int age)
{
Name = name;
Age = age;
}
}

class Program
{
static void Main()
{
List<Person> people = new List<Person>
{
new Person("Alice", 25),
new Person("Bob", 17),
new Person("Charlie", 30),
new Person("David", 15)
};

// 使用 Predicate 委托筛选年龄大于 18 岁的人
Predicate<Person> isAdult = person => person.Age > 18;
List<Person> adults = people.FindAll(isAdult);

// 输出结果
Console.WriteLine("成年人列表:");
foreach (Person person in adults)
{
Console.WriteLine($"{person.Name}, {person.Age} 岁");
}
}
}

输出:

成年人列表:
Alice, 25 岁
Charlie, 30 岁

在这个案例中,我们定义了一个 Predicate<Person> 委托 isAdult,它接受一个 Person 对象并返回 true 如果该对象的 Age 属性大于 18。然后,我们使用 FindAll 方法筛选出所有满足条件的成年人。

总结

Predicate 委托是 C# 中一个非常有用的工具,特别是在处理集合时。它允许我们定义一个条件,并将该条件应用于集合中的元素,从而筛选出满足条件的元素。

通过本文的学习,你应该已经掌握了 Predicate 委托的基本用法,并能够在实际项目中应用它。

警告

在使用 Predicate 委托时,请确保条件逻辑清晰且易于理解,以避免潜在的逻辑错误。

附加资源与练习

练习

  1. 创建一个整数列表,使用 Predicate 委托筛选出所有大于 10 的数。
  2. 创建一个字符串列表,使用 Predicate 委托筛选出所有长度大于 5 的字符串。
  3. 创建一个自定义类(例如 Product),并使用 Predicate 委托筛选出价格低于某个阈值的产品。

附加资源

通过练习和进一步的学习,你将能够更加熟练地使用 Predicate 委托,并在实际项目中灵活应用它。