所以我有这个方法:
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()方法?我被困在那里。那么,如果要在没有委托的情况下获得三种过滤方法的输出,该怎么办?
谢谢
您可以改用过滤器接口和类。但是,如果在这种简单情况下“更好”是值得商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());
然后您需要在方法中包括您的条件,如下所示:
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);
}
但是输出将不相同。