gpt4 book ai didi

c# - 过滤器函数的奇数签名

转载 作者:行者123 更新时间:2023-12-03 22:17:50 26 4
gpt4 key购买 nike

昨天有人问了我一个让我困惑的问题。我被要求实现接口(interface) 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)

编辑:对于实际用例,将学校想象为一个类(class)列表,其中每个类(class)本身都有一个 Student 列表和Teacher 。现在您想要获取所有那些超过给定数量(在我的示例中为 30)Person 的类。 (假设 StudentTeacher 继承自 Person )。最后,此方法可能会将生成的子列表展平为 Person 类型的单个枚举。让所有学生和老师都在满员类(class)内。

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

关于c# - 过滤器函数的奇数签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34160826/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com