将算法中某种行为提前给调用者去实现。
比如:
调用:
在这段代码中,调用者提前定义行为(筛选什么样的数据),而算法(查找人员的方法),它只管遍历。
如果没有委托,你怎么写?
你得写
FindPersonByName(string Name)
FindPersonByAge(int MinAge, int MaxAge)
FindPersonByRole(RoleType type)
FindPersonByXXX(...)
...
这些函数在遍历算法上相同,但是筛选的依据不同,于是相同的程序就要写很多次。
你有什么办法把这些方法写入一个函数,同时具有无限扩展性呢?
比如有人提出,我查找年龄不这么找,我找年龄是偶数的人(好奇怪的需求)。
用委托的代码很简单,查找函数不用改,用如下调用即可:
再比如,查找姓张的人
比如:
-
C# code
-
List < Person > FindPerson(Predicate < Person > condition) { List < Person > list = new List < Person > (); foreach ( var p in Persons) { if (condition(p)) list.Add(p); } return list; }
调用:
-
C# code
-
List < Person > list; // 查找名字叫张三的人。 list = FindPerson( delegate (Person p) { return p.Name == " 张三 " ; }); foreach ( var item in list) { Console.WriteLine(item); } // 查找年龄在20~30岁的人。 list = FindPerson( delegate (Person p) { return p.Age >= 20 && p.Age <= 30 ; }); foreach ( var item in list) { Console.WriteLine(item); } // 查找职务角色是经理的人 list = FindPerson( delegate (Person p) { return p.Role == RoleType.Manager; }); foreach ( var item in list) { Console.WriteLine(item); }
在这段代码中,调用者提前定义行为(筛选什么样的数据),而算法(查找人员的方法),它只管遍历。
如果没有委托,你怎么写?
你得写
FindPersonByName(string Name)
FindPersonByAge(int MinAge, int MaxAge)
FindPersonByRole(RoleType type)
FindPersonByXXX(...)
...
这些函数在遍历算法上相同,但是筛选的依据不同,于是相同的程序就要写很多次。
你有什么办法把这些方法写入一个函数,同时具有无限扩展性呢?
比如有人提出,我查找年龄不这么找,我找年龄是偶数的人(好奇怪的需求)。
用委托的代码很简单,查找函数不用改,用如下调用即可:
-
C# code
-
list = FindPerson( delegate (Person p) { return p.Age % 2 == 0 ; }); foreach ( var item in list) { Console.WriteLine(item); }
再比如,查找姓张的人
-
C# code
-
list = FindPerson( delegate (Person p) { return p.Name.SubString( 0 , 1 ) == " 张 " ; }); foreach ( var item in list) { Console.WriteLine(item); }
随着功能的增多,不使用委托的代码要么出现很多很多重复的方法,或者是一个很复杂的 switch case 分支,而且每次新的需求都要修改函数实现。
(原帖地址:http://topic.csdn.net/u/20110629/09/c652a6f9-c3b1-4ae7-9b76-80efa69f6063.html?89021)