使用Delegate的时候很多时候没必要使用一个普通的方法,因为这个方法只有这个Delegate会用,并且只用一次,这时候使用匿名方法最合适。
匿名方法就是没有名字的方法。
MyDelegate p = delegate(int s) { s = 10; };
在IL中编译器是给匿名方法生成了名字的
Action<int> a1 = delegate(int i) { Console.WriteLine(i); };
匿名方法最大的作用,是用来推导出lambda表达式
lambda表达式
函数式编程,在Entity framework编程中用的很多
*=>*读作goes to
//lambda表达式格式的匿名方法的写法
Action<int> a2 = (int i) => { Console.WriteLine(i); };
Action<int> a3 = (i) => { Console.WriteLine(i); };
//如果只有一个参数,可以不写括号
Action<int> a4 = i => { Console.WriteLine(i); };
a1(6);
//Func<string, int, bool> f1 = delegate(string s, int i) { return true; };
//Func<string, int, bool> f2 = (string s, int i) => { return true; };
//Func<string, int, bool> f3 = (s, i) => { return true; };
只有一行代码且为返回值,可以省略方法体和return;
//Func<string, int, bool> f4 = (s, i) => true;
Func<int, int> f1 = delegate(int i) { return i * 2; };
Func<int, int> f2 = (int i) => { return i * 2; };
Func<int, int> f3 = i => i * 2;
int j = f3(5);
Console.WriteLine(j);
普通匿名类型也是一样用lambda表达式
lambda表达式改造GetMax
举个栗子
class Program
{
static void Main(string[] args)
{
int[] nums = new int[] { 1, 3, 55, 66 };
//int m = GetMax(nums, compereInt);
//1
//Func<int, int, bool> f = delegate(int i1, int i2) { return i1 > i2; };
//int m = GetMax(nums,f);
//2
//int m = GetMax(nums, delegate (int i1,int i2){ return i1 > i2;});
//3
//int m = GetMax(nums, (i1, i2) => { return i1 > i2; });
Person[] Persons = new Person[] { new Person("baidu", 8), new Person("sina", 9), new Person("qq", 10) };
Person p = GetMax(Persons, (p1, p2) => p1.Age > p2.Age);
Console.WriteLine(p);
Console.ReadKey();
}
static bool compereInt(int i1, int i2)
{
return i1 > i2;
}
static T GetMax<T>(T[] objs, Func<T, T, bool> compereFunc)
{
T max = objs[0];
for (int i = 1; i < objs.Length; i++)
{
if (compereFunc(objs[i], max))//调用func指向的方法,判断谁大,写这段代码的人也不知道func指向哪个方法,只知道func指向的方法有两个object 参数一个bool返回值
max = objs[i];
}
return max;
}
class Person
{
public Person(string name, int age)
{
this.Name = name;
this.Age = age;
}
public int Age { get; set; }
public string Name { get; set; }
public override string ToString()
{
return "name=" + Name + ";age=" + Age;
}
}
}
展开和简化都要有个过程,牢记。
创建MyWhere
static class JiHeExt
{
public static IEnumerable<T> MyWhere<T>(this IEnumerable<T> data, Func<T, bool> func)
{
//foreach() 什么样的对象可以使用foreach遍历:实现了IEnumerabal接口
//List,数组等都实现了IEnumerable
List<T> resultList = new List<T>();
foreach (T item in data)
{
if (func(item))//遍历到的这条数据是否满足条件func
{
resultList.Add(item);
}
}
return resultList;
}
}
调用
static void Main(string[] args)
{
//int[] nums = new int[] { 3,5,8,10,12,13,15,17};
//IEnumerable<int> r1 = nums.MyWhere(i => i > 10);//delegate(int){return i>10;};
//IEnumerable<int> r1 = nums.MyWhere(i => i%2==0);//delegate(int){return i>10;};
//foreach (int item in r1)
//{
// Console.WriteLine(item);
//}
string [] nums = new string[] {"思宇","老耿","老孙","阿森"};
IEnumerable<string> r1 = nums.MyWhere(s=>s.Contains("老"));
foreach (string item in r1)
{
Console.WriteLine(item);
}
Console.ReadKey();
}