`

委托回调函数的妙用(c# code )

 
阅读更多
   //person类
  public  class Person
    {
        private string name;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        private int age;

        public int Age
        {
            get { return age; }
            set { age = value; }
        }
        private string role;

        public string Role
        {
            get { return role; }
            set { role = value; }
        } 
    }
//
 public class DelegateClass
    {
        private List Psersons;
        ///

        /// 待筛选的person集合
        ///
        public List Persons
        {
            get { return Psersons; }
            set { Psersons = value; }
        }
        public List FindPerson(Predicate condition)
        {
            List list = new List();
            foreach (var p in Persons)
            {
                if (condition(p))
                         list.Add(p);
            }
            return list;
        }
    }//委托函数调用
 class Program
    {
        static void Main(string[] args)
        {
            List list = new List();
            Person people = new Person();
            people.Name = "FrankPeng";
            people.Age = 25;
            people.Role = "软件工程师";
            list.Add(people);

            Person people1 = new Person();
            people1.Name = "Jack";
            people1.Age = 30;
            people1.Role = "项目主管";
            list.Add(people1);

            Person people2 = new Person();
            people2.Name = "James";
            people2.Age = 36;
            people2.Role = "总监";
            list.Add(people2);
           
            DelegateClass deleCall = new DelegateClass();
            deleCall.Persons = list;
            //查找名字叫张三的人。
            list = deleCall.FindPerson(delegate(Person p) { return p.Name == "张三"; });
            foreach (var item in list)
            {
                Console.WriteLine("姓名为张三的人:");
                Console.WriteLine(item.Name);
                Console.WriteLine(item.Age);
                Console.WriteLine(item.Role);
                Console.WriteLine("============================");
            }
            //查找年龄在20~30岁的人。
            list = deleCall.FindPerson(delegate(Person p) { return p.Age >= 20 && p.Age <= 30; });
            foreach (var item in list)
            {
                Console.WriteLine("年龄在20~30岁的人:");
                Console.WriteLine(item.Name);
                Console.WriteLine(item.Age);
                Console.WriteLine(item.Role);
                Console.WriteLine("============================");
            }
            ////查找职务角色是总监

            list = deleCall.FindPerson(delegate(Person p) { return p.Role == "总监"; });
            foreach (var item in list)
            {
                Console.WriteLine("职位为总监的人是:");
                Console.WriteLine(item.Name);
                Console.WriteLine(item.Age);
                Console.WriteLine(item.Role);
                Console.WriteLine("============================");
            }
        }
    }

 

在这段代码中,调用者提前定义行为(筛选什么样的数据),而算法(查找人员的方法),它只管遍历。
如果没有委托,你怎么写?
你得写
FindPersonByName(string Name)
FindPersonByAge(int MinAge, int MaxAge)
FindPersonByRole(RoleType type)
FindPersonByXXX(...)
...
这些函数在遍历算法上相同,但是筛选的依据不同,于是相同的程序就要写很多次。
你有什么办法把这些方法写入一个函数,同时具有无限扩展性呢?比如有人提出,我查找年龄不这么找,我找年龄是偶数的人(好奇怪的需求)。用委托的代码很简单,查找函数不用改,用如下调用即可:
你得写
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); 
    }
随着功能的增多,不使用委托的代码要么出现很多很多重复的方法,或者是一个很复杂的 switch case 分支,而且每次新的需求都要修改函数实现。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics