筛选器函数的奇数签名
本文关键字:函数 筛选 | 更新日期: 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)
编辑:对于实际用例,将学校想象成一个班级列表,其中每个班级本身都有一个Student
和Teacher
列表。现在,您希望获取所有具有超过给定数量(在我的示例中为 30(的类Person
(假设Student
和Teacher
从Person
继承(。最后,此方法可以将生成的子列表平展为一个类型 Person
的枚举,以获取超满班级中的所有学生和教师。
编辑2:由于您关心的是人员的属性而不是列表,因此您当然应该 - 正如您已经假设的那样 - 使用带有TType : Person
的Func<TType>
。对我来说似乎也是一种类型。
我同意你的分析,我想知道你得到了什么样的规范以及从哪里得到的。
定义IPeopleFinder
接口的人不仅应该编写代码,还应该记录它,至少在源代码中,更好:在需求文档中描述接口的原因,在软件架构文档中定义上下文,并在设计文档中描述详细用法。
只要您只有接口并且没有进一步的描述,只需抛出一个NotImplementedException
,因为尚未定义您应该做其他事情。