如何在没有委托的情况下编写过滤器方法?

how to write filter methods without delegate?

所以我有这个方法:


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() 方法呢?我被困在那里了。那么如果你想在没有delegate的情况下得到这三个filter方法的输出,你该怎么办呢?

谢谢

您可以使用过滤器接口,类 代替。但是,如果在这个简单的情况下是 "better",则值得商榷。

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;
    }
}

用法:

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

    foreach (var item in people)
    {
        if ( filter.Pass(item) ) Console.WriteLine($"{item.FirstName}, ${item.Age} years old");
    }
}
// and then ...
DisplayPeople("Children", people, new ChildFilter());
DisplayPeople("Pubers", people, new PuberFilter());
DisplayPeople("Adults", people, new AdultFilter());