1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace CsharpDataStructure 7 { 8 class Program 9 { 10 //声明:本程序只说明几种常见委托和代理的使用,名称的定义不是很规范 11 public delegate void MyAction<T>(T obj);//自己定义的委托,无返回值,只有一个泛型参数 12 static void Main(string[] args) 13 { 14 var method=new MyAction<int>(PrintInt); 15 var selectBig = new Func<List<int>,int,int>(SelectBig);//创建一个Func代理,参数有两个,一个是list,一个是int;返回值是int 16 var boolMethod = new Predicate<int>(a => { return a > 3; });//创建一个Predicate类型的代理,只有一个参数int型,返回值默认bool型, 17 var bigMethod = new Action<int,int>(ShowBig);//创建一个Action型的代理,有两个int类型参数,默认无返回值 18 method(3); 19 int i = 6; 20 if (boolMethod(i)) 21 { 22 Console.WriteLine(i); 23 } 24 bigMethod(6,7); 25 List<int> mm = new List<int>() { 4, 6, 9, 8 }; 26 Console.WriteLine(selectBig(mm, 3)); 27 int[] number = new int[6] { 1, 2, 3, 4, 5 ,8}; 28 IEnumerable<int> result = Filter<int>(number, (int item) => { return item > 3; });//可枚举类型的拓展,方法是lambda表达式 29 foreach (var item in result) 30 { 31 Console.WriteLine(item); 32 } 33 Console.ReadLine(); 34 } 35 static void PrintInt(int i) 36 { 37 Console.WriteLine(i); 38 } 39 static void ShowBig(int m,int n) 40 { 41 if(m>=n) 42 Console.WriteLine(m); 43 else 44 Console.WriteLine(n); 45 } 46 static int SelectBig(List<int> a,int b) 47 { 48 return a.Max()-b; 49 } 50 public static IEnumerable<T> Filter<T>(IEnumerable<T> ObjectList, Predicate<T>FilterFunc)//可枚举类型拓展:返回类型是可枚举的,参数一个是可枚举类型,一个是代理方法 51 { 52 List<T> ResultList = new List<T>(); 53 foreach (var item in ObjectList) 54 { 55 if (FilterFunc(item)) 56 { 57 ResultList.Add(item); 58 } 59 } 60 return ResultList; 61 } 62 } 63 }
.NET类库在System名称空间,下定义了三种比较常用的泛型委托
Predicate<T>委托:
public delegate bool Predicate<T>(T obj);
这个委托描述的方法为接收一个T类型的参数,返回一个BOOL类型的值,一般用于比较方法
Action<T>委托
public delegate void Action<T>(T obj);
public delegate void Action<T1, T2>(T1 arg1, T2 arg2);
这个委托描述的方法,接收一个或多个T类型的参数(最多16个,我这里只写了两种类型的定义方式),没有返回值
Func<T>委托
public delegate TResult Func<TResult>();
public delegate TResult Func<T, TResult>(T arg);
这个委托描述的方法,接收零个或多个T类型的参数(最多16个,我这里只写了两种类型的定义方式),
与Action委托不同的是,它有一个返回值,返回值的类型为TResult类型的。