昨天有人问我一个问题,这使我陷入混乱。我被要求实现接口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)
编辑:对于一个实际的用例,将一所学校作为一个班级列表,其中每个班级本身都有一个
Student
和Teacher
列表。现在,您要获取所有具有大于给定数量(在我的示例中为30)的Person
类(假设Student
和Teacher
都继承自Person
)。最终,该方法可以将结果子列表展平为类型为Person
的单个枚举,以使全部学生和教师都属于满班。EDIT2:当您关心人员的属性而不是列表时,您当然应该-如您已经假定的-将
Func<TType>
与TType : Person
一起使用。在我看来也像是一种类型。关于c# - 过滤器功能的奇数签名,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34160826/