2017-11-16 9 views
0

私は、以下の検索条件の1つ以上に基づいてオブジェクトのコレクション(予約など)を検索する必要があります。私はこれを実装するためにフィルタパターンを使用するつもりです。フィルター条件を動的に作成するためのフィルター設計パターンの使用

検索オプション:FIRSTNAME、姓、電話、電子メール

要件である - ユーザーが唯一fistnameフィルタを指定した場合には、フィルタリングするだけファーストネームを使用しています。ユーザーがファーストネームとフォンの両方を指定している場合は、両方を使用してフィルタリングします。 4つのオプションがすべて指定されている場合は、すべて4を使用します。

4つの検索条件のすべてのクラスを作成しました。私はそれをどのように使うのか疑問に思っています。たとえば、

ISearchCriteria searchCriteria; 

    if(firstName != null) 
    { 
      searchCriteria= new FirstNameSearchCriteria(CurrentClient); 
    } 

    if(lastName!= null) 
    { 
      //what do I do here? I have an AndCriteria class which accepts two ISearchCriteria objects. How do I use it? 
    } 

この検索シナリオを処理する正しい方法は何ですか?

答えて

1

インターセプトフィルターパターンを使用して、問題ステートメントのソリューションを設計する必要があります。右、

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<Person> persons = new List<Person>(); 

     persons.Add(new Person { FirstName = "Robert", LastName = "kerry", Phone = "1234", Email = "[email protected]"}); 
     persons.Add(new Person { FirstName = "Robert", LastName = "Sam", Phone = "1234", Email = "[email protected]" }); 
     persons.Add(new Person { FirstName = "Jon", LastName = "Kam", Phone = "1234", Email = "[email protected]" }); 

     Console.WriteLine("---Search by First and Last Name----"); 
     ICriteria firstName = new CriteriaFirstName("Robert"); 
     ICriteria lastName = new CriteriaLastName("Kerry"); 
     ICriteria fullName = new AndCriteria(firstName, lastName); 
     var searchedData = fullName.MeetCriteria(persons); 

     //Search by First and last name (And criteria) 
     foreach (var person in searchedData) 
     { 
      Console.WriteLine(person.FirstName); 
      Console.WriteLine(person.LastName); 
      Console.WriteLine(person.Phone); 
     } 

     //Search by first name and email. (And Criteria) 
     firstName = new CriteriaFirstName("Robert"); 
     var email = new CriteriaEmail("[email protected]"); 
     fullName = new AndCriteria(firstName, email); 
     searchedData = fullName.MeetCriteria(persons); 
     foreach (var person in searchedData) 
     { 
      Console.WriteLine(person.FirstName); 
      Console.WriteLine(person.LastName); 
      Console.WriteLine(person.Phone); 
     } 

     Console.WriteLine("---Search by First Name Only----"); 
     firstName = new CriteriaFirstName("Robert"); 
     searchedData = firstName.MeetCriteria(persons); 
     foreach (var person in searchedData) 
     { 
      Console.WriteLine(person.FirstName); 
      Console.WriteLine(person.LastName); 
      Console.WriteLine(person.Phone); 
     } 

     Console.WriteLine("---Search by First Name or email ----"); 
     //Search by first name . (or Criteria) 
     firstName = new CriteriaFirstName("Robert"); 
     email = new CriteriaEmail("[email protected]"); 
     fullName = new OrCriteria(firstName, email); 
     searchedData = fullName.MeetCriteria(persons); 
     foreach (var person in searchedData) 
     { 
      Console.WriteLine(person.FirstName); 
      Console.WriteLine(person.LastName); 
      Console.WriteLine(person.Phone); 
     } 

     Console.ReadKey(); 
    } 
} 
+1

私は以下を参照してください

public class Person { public String FirstName { get; set; } public String LastName { get; set; } public String Phone { get; set; } public String Email { get; set; } } public interface ICriteria { List<Person> MeetCriteria(List<Person> persons); } public class CriteriaFirstName : ICriteria { private string searchCriteria; public CriteriaFirstName(string searchCriteria) { this.searchCriteria = searchCriteria; } public List<Person> MeetCriteria(List<Person> persons) { List<Person> personsData = new List<Person>(); foreach (var item in persons) { if (item.FirstName.ToUpper().Equals(searchCriteria.ToUpper())) { personsData.Add(item); } } return personsData; } public class CriteriaLastName : ICriteria { private string searchCriteria; public CriteriaLastName(string searchCriteria) { this.searchCriteria = searchCriteria; } public List<Person> MeetCriteria(List<Person> persons) { List<Person> personsData = new List<Person>(); foreach (var item in persons) { if (item.LastName.ToUpper().Equals(searchCriteria.ToUpper())) { personsData.Add(item); } } return personsData; } } public class CriteriaLastPhone : ICriteria { private string searchCriteria; CriteriaLastPhone(string searchCriteria) { this.searchCriteria = searchCriteria; } public List<Person> MeetCriteria(List<Person> persons) { List<Person> personsData = new List<Person>(); foreach (var item in persons) { if (item.Phone.ToUpper().Equals(searchCriteria.ToUpper())) { personsData.Add(item); } } return personsData; } } public class CriteriaEmail : ICriteria { private string searchCriteria; public CriteriaEmail(string searchCriteria) { this.searchCriteria = searchCriteria; } public List<Person> MeetCriteria(List<Person> persons) { List<Person> personsData = new List<Person>(); foreach (var item in persons) { if (item.Email.ToUpper().Equals(searchCriteria.ToUpper())) { personsData.Add(item); } } return personsData; } } public class AndCriteria : ICriteria { private ICriteria criteria; private ICriteria otherCriteria; public AndCriteria(ICriteria criteria, ICriteria otherCriteria) { this.criteria = criteria; this.otherCriteria = otherCriteria; } public List<Person> MeetCriteria(List<Person> persons) { List<Person> firstCriteriaPersons = criteria.MeetCriteria(persons); return otherCriteria.MeetCriteria(firstCriteriaPersons); } } public class OrCriteria : ICriteria { private ICriteria criteria; private ICriteria otherCriteria; public OrCriteria(ICriteria criteria, ICriteria otherCriteria) { this.criteria = criteria; this.otherCriteria = otherCriteria; } public List<Person> MeetCriteria(List<Person> persons) { List<Person> firstCriteriaItems = criteria.MeetCriteria(persons); List<Person> otherCriteriaItems = otherCriteria.MeetCriteria(persons); foreach (var otherItems in otherCriteriaItems) { if (!firstCriteriaItems.Contains(otherItems)) { firstCriteriaItems.Add(otherItems); } } return firstCriteriaItems; } } 

ドライバコード:

以下はフィルタパターンをインターセプトして使用してコードです。ありがとう、これは私が逃したものです。 – devC

関連する問題