如何编写没有委托的过滤器方法?

问题描述 投票:0回答:2

所以我有这个方法:


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()方法?我被困在那里。那么,如果要在没有委托的情况下获得三种过滤方法的输出,该怎么办?

谢谢

c# delegates
2个回答
3
投票

您可以改用过滤器接口和类。但是,如果在这种简单情况下“更好”是值得商bat的。

interface PersonFilter{
    bool Pass(Person p);
}

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());    

0
投票

然后您需要在方法中包括您的条件,如下所示:

foreach (var person in people)
{
    if(person.Age <= 10)                
      Console.WriteLine("{0}: {1}, {2} years old", "children", item.FirstName, item.Age);
    else if (person.Age < 18)
      Console.WriteLine("{0}: {1}, {2} years old", "puber", item.FirstName, item.Age);
    else
      Console.WriteLine("{0}: {1}, {2} years old", "adult", item.FirstName, item.Age);
}

但是输出将不相同。

© www.soinside.com 2019 - 2024. All rights reserved.