コールバック関数の妙用を依頼する(c#code)

4820 ワード

   //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ブランチが発生し、新しいニーズのたびに関数実装を修正します.