昨天有人问我一个问题,这使我陷入混乱。我被要求实现接口IPeopleFinder

public interface IPeopleFinder
{
    IEnumerable<Person> GetByAge(List<Person> people, int age);
    IEnumerable<Person> Find<TType>(Func<IEnumerable<TType>, bool> filter);
}


在这个班上:

public class People
{
    public List<Student> Students { get; }
    public List<Teacher> Teachers { get; }
}


第一个功能很简单,但是第二个功能我不明白它要做什么:

IEnumerable<Person> Find<TType>(Func<IEnumerable<TType>, bool> filter);


我不理解IEnumerable<TType>中的Func。如果签字是:

IEnumerable<Person> Find<TType>(Func<TType, bool> filter);


filter传递给IEnumerable<T>.Where()函数很简单。

有人可以解释一下接受IEnumerable<T>并返回bool的过滤器函数如何工作吗?我开始认为这是一个错字,应该为Func<TType, bool>

约束说明:

这样定义了类:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public ushort Age { get; set; }
    public Sex Sex { get; set; }
}

public class Student : Person
{
    public Major Major { get; set; }
}

public class Teacher : Person
{
    public Department Department { get; set; }
}


TType被限制为Person类型。

问题的编写方式,一旦实现了Find方法,将用于查找某个学科的所有Student专业,以及属于某个部门的所有Teacher

最佳答案

显然,该方法应适用于枚举之类的枚举,例如

var l = new List<List<Student>>();


现在,您可以调用myPeopleFinder.Find(x => x.Any()),它将返回一个学生枚举。

一个更好的示例是从枚举中筛选具有特定大小的那些子列表:

myPeopleFinder.Find(x => x.Count() > 30)


编辑:对于一个实际的用例,将一所学校作为一个班级列表,其中每个班级本身都有一个StudentTeacher列表。现在,您要获取所有具有大于给定数量(在我的示例中为30)的Person类(假设StudentTeacher都继承自Person)。最终,该方法可以将结果子列表展平为类型为Person的单个枚举,以使全部学生和教师都属于满班。

EDIT2:当您关心人员的属性而不是列表时,您当然应该-如您已经假定的-将Func<TType>TType : Person一起使用。在我看来也像是一种类型。

关于c# - 过滤器功能的奇数签名,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34160826/

10-12 20:04