Predicate 泛型委托认识

本文介绍了.NET Framework 2.0中新增的Predicate泛型委托,该委托用于定义一组条件来判断对象是否符合这些条件。文章重点讲解了如何使用Predicate泛型委托在List<T>.FindIndex()方法中实现查询条件。

Predicate 泛型委托

注意:此委托在 .NET Framework 2.0 版中是新增的。

表示定义一组条件并确定指定对象是否符合这些条件的方法。

以下两个函数用到Predicate 泛型委托:

List<T>.FindIndex()

Array.Find(T[ ], Func);  // Func是 bool Func(T) { /*查询条件,符合查询条件时返回true*/ }的方法名
参见:http://technet.microsoft.com/zh-cn/magazine/bfcke1bz%28VS.80%29.aspx

使用方法如下:

List<double> lists;

// 此处进行初始化

list.Sort();

double b=0;

int i = list.FindIndex( delegate(double a) {return a>b;} );  // 返回List中符合查询条件的索引

// 搜索与指定谓词所定义的条件相匹配的元素,返回 List 或它的一部分中第一个匹配项的从零开始的索引。

b=list[i];


委托在C#中是一种非常强大的工具,它允许我们定义可以处理多种数据类委托。通过使用委托,我们可以创建更通用、更灵活的代码。 ### 使用委托的方式 C# 提供了几个内置的委托,如 `Func<T, TResult>`、`Action<T>` 和 `Predicate<T>` 等。下面详细介绍如何使用这些委托。 #### 1. `Func<T, TResult>` `Func<T, TResult>` 是一个委托,表示一个接受参数并返回值的方法。它可以有一个或多个输入参数,并且必须有一个返回值。 **示例代码:** ```csharp using System; class Program { static void Main() { // 定义一个 Func 委托,接受 int 参数并返回 int 结果 Func<int, int> square = x => x * x; // 调用委托 Console.WriteLine(square(5)); // 输出 25 } } ``` **解释:** - `Func<int, int>` 表示一个接受 `int` 类参数并返回 `int` 类结果的委托。 - 我们使用 Lambda 表达式 `x => x * x` 来定义这个委托的行为。 - 当调用 `square(5)` 时,它会计算 `5 * 5` 并返回 `25`。 --- #### 2. `Action<T>` `Action<T>` 是一个委托,表示一个接受参数但不返回任何值(即返回 `void`)的方法。 **示例代码:** ```csharp using System; class Program { static void Main() { // 定义一个 Action 委托,接受 string 参数 Action<string> greet = name => Console.WriteLine($"Hello, {name}"); // 调用委托 greet("Alice"); // 输出 Hello, Alice } } ``` **解释:** - `Action<string>` 表示一个接受 `string` 类参数但不返回任何值的委托。 - 我们使用 Lambda 表达式 `name => Console.WriteLine($"Hello, {name}")` 来定义这个委托的行为。 - 当调用 `greet("Alice")` 时,它会在控制台输出 `Hello, Alice`。 --- #### 3. `Predicate<T>` `Predicate<T>` 是一个委托,通常用于需要布尔返回值的场景,例如过滤集合中的元素。 **示例代码:** ```csharp using System; using System.Collections.Generic; class Program { static void Main() { List<int> numbers = new List<int> { 1, 2, 3, 4, 5 }; // 定义一个 Predicate 委托,用于筛选偶数 Predicate<int> isEven = x => x % 2 == 0; // 使用 FindAll 方法筛选出偶数 List<int> evenNumbers = numbers.FindAll(isEven); // 输出结果 Console.WriteLine(string.Join(", ", evenNumbers)); // 输出 2, 4 } } ``` **解释:** - `Predicate<int>` 表示一个接受 `int` 类参数并返回 `bool` 类结果的委托。 - 我们使用 Lambda 表达式 `x => x % 2 == 0` 来定义这个委托的行为。 - `numbers.FindAll(isEven)` 会返回所有满足 `isEven` 条件的元素。 --- ### 自定义委托 除了使用内置的委托,我们还可以定义自己的委托。 **示例代码:** ```csharp using System; // 自定义委托 public delegate TResult MyFunc<in T, out TResult>(T input); class Program { static void Main() { // 定义一个 MyFunc 委托,接受 int 参数并返回 int 结果 MyFunc<int, int> triple = x => x * 3; // 调用委托 Console.WriteLine(triple(10)); // 输出 30 } } ``` **解释:** - `MyFunc<in T, out TResult>` 是一个自定义的委托,表示一个接受 `T` 类参数并返回 `TResult` 类结果的委托。 - 我们使用 Lambda 表达式 `x => x * 3` 来定义这个委托的行为。 - 当调用 `triple(10)` 时,它会计算 `10 * 3` 并返回 `30`。 --- ### 总结 委托使得代码更加通用和灵活,减少了重复代码的编写。常用的内置委托包括: - `Func<T, TResult>`:接受参数并返回值。 - `Action<T>`:接受参数但不返回值。 - `Predicate<T>`:接受参数并返回布尔值。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值