コールバック関数の妙用を依頼する(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ブランチが発生し、新しいニーズのたびに関数実装を修正します.