前言
在c#我们可以自定义委托,但是c#为什么还要内置泛型委托呢?因为我们常常要使用委托,如果系统内置了一些你可能会用到的委托,那么就省去了定义委托,然后实例化委托的步骤,这样一来既使代码看起来简洁而干净又能提高程序员的开发速度,何乐不为呢!通过本文可以让你复习扩展方法,同时可以循序渐进的了解系统内置泛型委托的实现以及委托逐步的演化过程。
,
行动概念:封装一个方法,该方法具有五个参数并且不返回值。并且类型参数为逆变
下面我就自定义实现一个Action
<>之前,,,public class 人 ,,,{,,,,,,,public string Name {组,得到,,,},,,,,,,,public int Age {组,得到,,,},,,,,,,,public bool Gender {组,得到,,,} ,,,}
然后在控制台中通过,,方法模拟行动委托,先定义一个获得的人列表GetList ()
<>之前,,,,,,,,static List
因为我们知道在用委托时,有这样几个步骤:
(1)定义委托
(2)实例化委托
(3)将方法指针添加到实例化委托对象中
,但是现在我们无需定义委托,已经有了内置委托,只需将其实例化即可,同时添加方法的指针一般是有明确的方法,如果我们只是临时的用方法,这时就可以派匿名方法上场了,所以上面三步就可以简化成两步。代码如下:
<>之前,,,,,,,,,,,,var list =, GetList (); ,,,,,,,,,,,list.ForEach (new Action< Person> ,,,,,,,,,,,,,,,(,,,,,,,,,,,,,,,,,委托(Person p) ,,,,,,,,,,,,,,,,,{ ,,,,,,,,,,,,,,,,,,,,,Console.WriteLine (p.Name); ,,,,,,,,,,,,,,,,,} ,,,,,,,,,,,,,,,));
上述代码颇有点jQuery中每个的遍历方法的意味。结果打印出:
,我们知道ForEach这个方法里面的的参数就是,,,所以我们可以直接进行如下简写
<>之前,list.ForEach(委托(Person p), {, Console.WriteLine (p.Name);,});其打印结果和上面是一样的。其代码可以继续进行更加的精简,不着急,我们循序渐进的谓词来。
概念:定义一组条件并确定指定对象是否符合这些条件的方法。返回值为bool类型,并且类型参数为逆变。
用到此泛型委托莫过于列表中的,,方法了,它就是从一个集合中根据条件筛选出一个新的集合出来。上节刚好学过扩展方法,我们可以自定义实现这个方法用扩展方法加在泛型集合列表上根据,,,
static List, SelfDefineFindAll ,(却;能够List ,,, Predicate , pre),,,/*注意:既然是添加的扩展方法,在此例中控制台的程序也要声明为静态类*/{ ,,,,,List , preList =, new List ,,/*根据条件筛选出的数据添加到该集合中*/,,,, ,,,,,foreach (T T 拷贝列表) ,,,,{,,,,,,,,,,,if (pre (t)),/*根据条件进行筛选*/,,,,,,,,,,,{ ,,,,,,,,,,,,,,,preList.Add (t); null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null λ表达式之进化