Как написать методы фильтра без делегата? - PullRequest
0 голосов
/ 10 января 2020

Итак, у меня есть следующие методы:


public class Person
    {
        public string FirstName { get; set; }
        public int Age { get; set; }
    }

    public delegate bool filterDelegate(Person person);

     public  class Program
    {
        static void Main(string[] args)
        {
            Person p1 = new Person { FirstName = "Niels", Age = 10 };
            Person p2 = new Person { FirstName = "Margo", Age = 14 };
            Person p3 = new Person { FirstName = "Henkie", Age = 15 };
            Person p4 = new Person { FirstName = "Jan", Age = 16 };
            Person p5 = new Person { FirstName = "Jaco", Age = 20 };
            Person p6 = new Person { FirstName = "Rein", Age = 5 };


            List<Person> people = new List<Person>() { p1, p2, p3, p4, p5, p6 };


            DisplayPeople("children", people, IsChild);
            DisplayPeople("Pubers", people, isPuber);
            DisplayPeople("Adults", people, isAdult);


            Console.ReadKey();
        }

        static void DisplayPeople(string title, List<Person> people, filterDelegate filter) 
        {
            Console.WriteLine(title);
            foreach (var item in people)
            {
                if(filter(item))
                    Console.WriteLine("{0}, {1} years old", item.FirstName, item.Age);
            }

            Console.WriteLine("\n\n");
        }

        //Filters:

        static bool IsChild(Person person) 
        {
            return person.Age <= 10;        
        }

        static bool isPuber(Person person)
        {
            return person.Age > 10 && person.Age < 18;
        }

        static bool isAdult(Person person)
        {
            return person.Age >= 18;
        }
    }

И, как вы видите, он использует объект делегата. Но теперь, для моего собственного понимания, я хочу написать это без объекта делегата.

Итак, я пробую это так:


public class Person
    {
        public string FirstName { get; set; }
        public int Age { get; set; }
    }


    class Program
    {
        static void Main(string[] args)
        {

            Person p1 = new Person { FirstName = "Niels", Age = 10 };
            Person p2 = new Person { FirstName = "Margo", Age = 14 };
            Person p3 = new Person { FirstName = "Henkie", Age = 15 };
            Person p4 = new Person { FirstName = "Jan", Age = 16 };
            Person p5 = new Person { FirstName = "Jaco", Age = 20 };
            Person p6 = new Person { FirstName = "Rein", Age = 5 };


            List<Person> people = new List<Person>() { p1, p2, p3, p4, p5, p6 };

             DisplayPeople()...

        }

       static void DisplayPeople(string title, List<Person> people)
        {
            Console.WriteLine(title);

            foreach (var item in people)
            {
                Console.WriteLine($"{item.FirstName}, ${item.Age} years old");
            }
        }

        static bool IsChild(Person person)
        {
            return person.Age <= 10;
        }

        static bool isPuber(Person person)
        {
            return person.Age > 10 && person.Age < 18;
        }

        static bool isAdult(Person person)
        {
            return person.Age >= 18;
        }
    }

Но как теперь использовать метод DisplayPeople ()? Там я застрял. Итак, что вам нужно сделать, если вы хотите получить выходные данные трех методов фильтра без делегата?

Спасибо

1 Ответ

5 голосов
/ 10 января 2020

Вместо этого вы можете использовать интерфейс фильтра и классы. Если это "лучше" в этом простом случае спорна, однако

interface PersonFilter{
    bool Pass(Person person);
}

class ChildFilter : PersonFilter
{
    public bool Pass(Person person)
    {
        return person.Age <= 10;
    }
}

class PuberFilter : PersonFilter
{
    public bool Pass(Person person)
    {
        return person.Age > 10 && person.Age < 18;
    }
}

class AdultFilter : PersonFilter
{
    public bool Pass(Person person)
    {
        return person.Age > 18;
    }
}

использование:.

1005 *
...