过滤器Func

时间:2015-12-08 16:19:03

标签: c#

昨天我被问到一个问题,就是让我陷入困境。我被要求实施界面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)); 的内容。到某个部门。

2 个答案:

答案 0 :(得分:4)

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

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。对我来说似乎也是一种类型。

答案 1 :(得分:1)

我同意你的分析,我想知道你得到了什么样的规范以及从哪里开始。

定义IPeopleFinder接口的人不仅应编写代码,还应至少在源代码中对其进行记录:更好地描述需求文档中接口的原因,在软件中定义上下文架构文档并描述设计文档中的详细用法。

只要您只有接口而没有进一步说明,只需抛出NotImplementedException,因为尚未定义您应该执行其他操作。