AI智能
改变未来

C#内置泛型委托(Func委托、Action委托、Predicate委托)

微软给我们封装了许多的委托方法,例如Func,Action,Perdicate等,在工作学习中这些委托也足够我们使用了

Func委托

什么是Func委托

Func委托代表有返回类型的委托

Func委托定义

using System.Runtime.CompilerServices;namespace System{//// 摘要://     封装一个方法,该方法具有两个参数,并返回由 TResult 参数指定的类型的值。//// 参数://   arg1://     此委托封装的方法的第一个参数。////   arg2://     此委托封装的方法的第二个参数。//// 类型参数://   T1://     此委托封装的方法的第一个参数的类型。////   T2://     此委托封装的方法的第二个参数的类型。////   TResult://     此委托封装的方法的返回值类型。//// 返回结果://     此委托封装的方法的返回值。[TypeForwardedFrom(\"System.Core, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=b77a5c561934e089\")]public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2);}public delegate TResult Func<out TResult>();public delegate TResult Func<in T,out TResult>(T1 arg1);public delegate TResult Func<in T1,in T2,...,in T16, out TResult>(T1 arg1, ..., T2 arg2) ;

Func泛型委托引用了一个带有一个返回值的方法,它可以传递0或者多到16个参数类型,和一个返回类型。

它可以没有传递参数,但是一定要有返回类型。

Func的基本使用

求两个数相加,定义一个方法,直接调用

class Program{static void Main(string[] args){//【1】调用Add方法使用double result = Add(10, 20);Console.WriteLine(result);//【2】使用FuncFunc<int, int, double> func1 = Add;Console.WriteLine(func1(10, 20));//【3】使用Func+Lambda,省略方法Func<int, int, double> func2 = (a, b) => a + b;Console.WriteLine(func2(10, 20));Console.ReadLine();}static double Add(int a, int b){return a + b;}}

有一个面试题:编写一个方法,从数组的指定位置抽取连续的几个数,求和,求积。(使用委托)
一般是编写两个求和求积的方法
可以抽取方法中的变化的相乘、相加,封装不变的代码

class Program{static void Main(string[] args){int[] nums = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };int result1 = GetSum(nums, 0, 3);int result2 = GetMultipy(nums, 0, 3);int result3 = GetResult((a, b) => a + b, nums, 0, 3);int result4 = GetResult((a, b) => a * b, nums, 0, 3);Console.WriteLine(result1);Console.WriteLine(result2);Console.WriteLine(result3);Console.WriteLine(result4);Console.ReadLine();}//求和static int GetSum(int[] nums, int from, int to){int result = 0;for (int i = from; i <= to; i++){result += nums[i];}return result;}//求积static int GetMultipy(int[] nums, int from, int to){int result = 1;for (int i = from; i <= to; i++){result *= nums[i];}return result;}//使用Func委托static int GetResult(Func<int, int, int> func, int[] nums, int from, int to){int result = nums[from];for (int i = from + 1; i <= to; i++){result = func(result, nums[i]);}return result;}}

Action委托

什么是Action委托

Action委托代表无返回值的委托
常应用于:跨线程访问可视化控件

Action委托定义

public delegate Action<in T>;public delegate Action<in T1,in T2,...,in T16> ;

Action委托基本使用

class Program{static void Main(string[] args){Action<string> action = a => Console.WriteLine(\"你好,{0}!\", a);action(\"Action委托\");Console.ReadLine();}}

Predicate委托

Predicate委托基本介绍

表示定义一组条件并确定指定对象是否符合这些条件的方法。此委托由 Array 和 List 类的几种方法使用,用于在集合中搜索元素。
此委托返回一个bool值的方法

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

List中的FindAll()

Predicate委托基本使用

class Program{static void Main(string[] args){List<Product> list = new List<Product>(){new Product(){ProductId = 0001,ProductName = \"百事可乐\"},new Product(){ProductId = 0002,ProductName = \"可口可乐\"},new Product(){ProductId = 0003,ProductName = \"薯片\"},new Product(){ProductId = 0004,ProductName = \"辣条\"},new Product(){ProductId = 0005,ProductName = \"饼干\"}};//使用Linq也可以List<Product> list2 = list.FindAll(p => p.ProductId > 0002);foreach (var item in list2){Console.WriteLine(item.ProductId + \":\" + item.ProductName);}Console.ReadLine();}}
赞(0) 打赏
未经允许不得转载:爱站程序员基地 » C#内置泛型委托(Func委托、Action委托、Predicate委托)