昨天我被问到一个问题,就是让我陷入困境。我被要求实施界面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
所有属于$auth_header = array("Authorization: Basic " . base64_encode(client_id.":".client_secret));
的内容。到某个部门。
答案 0 :(得分:4)
显然,该方法应该适用于枚举的枚举,例如
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
。对我来说似乎也是一种类型。
答案 1 :(得分:1)
我同意你的分析,我想知道你得到了什么样的规范以及从哪里开始。
定义IPeopleFinder
接口的人不仅应编写代码,还应至少在源代码中对其进行记录:更好地描述需求文档中接口的原因,在软件中定义上下文架构文档并描述设计文档中的详细用法。
只要您只有接口而没有进一步说明,只需抛出NotImplementedException
,因为尚未定义您应该执行其他操作。