筛选器函数的奇数签名

本文关键字:函数 筛选 | 更新日期: 2023-09-27 18:26:15

昨天有人问我一个问题,这个问题让我陷入了循环。我被要求实现接口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);

Func中的IEnumerable<TType>是我不明白的。如果签名是:

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(假设StudentTeacherPerson继承(。最后,此方法可以将生成的子列表平展为一个类型 Person 的枚举,以获取超满班级中的所有学生和教师。

编辑2:由于您关心的是人员的属性而不是列表,因此您当然应该 - 正如您已经假设的那样 - 使用带有TType : PersonFunc<TType>。对我来说似乎也是一种类型。

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

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

只要您只有接口并且没有进一步的描述,只需抛出一个NotImplementedException,因为尚未定义您应该做其他事情。